;-> AmySequencer2 by Stefano Maria Regattin
;d> 19 gennaio 2002 da AmySequencer
;m> 20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10,11,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,31 marzo 2002
;m> 1,2,4,5,6,8,9,10,11,13,14,19,20,21,22,24,25,28,29,30 aprile 2002
;m> 4,5,6,8,9,10,11,12,13,14,15,17,18 maggio 2002
;m> 12,14,15,16,17,20,22,23,28,30 giugno 2002
;m> 1,3,4,5,9,10,13,15,16 luglio 2002
;m> 10,13,14,23 agosto 2002
;m> 2,5,22 settembre 2002
;m> 8,9,12,16,17,18,20,21,22,23,24,25,26,28 ottobre 2002
;m> 4,5,6,7,9,12,13,18,19,21,23,25,29 novembre 2002
;m> 4,6,21,23,24,25,30 dicembre 2002
;m> 1,2,3,4,6,17,21 gennaio 2003
;m> 7,16 marzo 2003
;m> 5 aprile 2003
;m> 25 maggio 2003
;m> 9,12,13,14,15,16,17,18,21,22,23,24 giugno 2003
;m> 9,10,11,12,13,21,22,23,29 luglio 2003
;m> 10,30 agosto 2003
;m> 1,3,13,14,15 settembre 2003
;m> 5,11,12 ottobre 2003
;m> 12,15 novembre 2003
;m> 3,4,5,6,7,8,14,15,20,23 marzo 2004
;m> 19,20,21,22,23 aprile 2004
;------------------------------

;----------------------------------------------------------------------
;le seguenti linee servono per la corretta gestione della versione del
; programma
;the following lines are for the correct handling of the program's version
;--------------------------------------------------------------------------
JMP InizioDelProgramma

Dc.b "$VER: AmySequencer 0.21 (23.4.2004)"
;-----------------------
;versione del programma
;program version
;----------------

Even

;program start
InizioDelProgramma

;------------------------------------------
;dati per i colori originali dello schermo
;original screen colours data
;-----------------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6

;------------------------------------------------------------------------
;il seguente comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Lavoro:Linguaggi/Blitz/"

;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;this command inserts one unique time in this point of the program the
; specified source code
;-----------------------
XINCLUDE "MIDIConstants.bb2"

;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento; ce ne e' una per gli AMIGA PAL e una per
; quelli NTSC
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------

;PAL timing
#TemporizzazionePAL=3546895

;NTSC timing
#TemporizzazioneNTSC=3579545

;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0

;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period; on the oldest AMIGA the
; lowerst usable period is 123, but I have choosen minimum period of 125, that is
; the A note in the ninth octave
;--------------------------------
#PeriodoMinimo=125

;---------------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei colori
; disponibili
;this constant states the colour palette referring number
;---------------------------------------------------------
#TavolozzaDeiColori=0

;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------

;window sizing gadget
#BottoneRidimensionaFinestra=1

;draggable window
#FinestraMovibile=2

;window depth gadget
#BottoneNascondiFinestra=4

;window close gadget
#BottoneChiudiFinestra=8

;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16

;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32

;backdrop window
#FinestraDiSfondo=256

;gimme-zero-zero window
#FinestraConMemoriaSfondo=1024

;borderless window
#FinestraSenzaBordi=2048

;window active
#FinestraAttivata=4096

;-------------------------------------------------
;le seguenti costanti indicano il tipo di bottoni
;the following constants state the gadgets' kind
;------------------------------------------------

;invert
#InvertiGadget=1

;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2

;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4

;size as window's inner width
#ComeLarghezzaInternaFinestra=8

;size as window's inner height
#ComeAltezzaInternaFinestra=16

;box select
#ScatolaDaSelezionare=32

;horiziontal movement
#MovimentoOrizzontale=64

;vertical movement
#MovimentoVerticale=128

;no border
#NessunBordo=256

;exclude each other
#SiEscludonoLUnLAltro=512

;attach to window's right side
#AttaccaAllaFinestraADestra=1024

;attach to window's left side
#AttaccaAllaFinestraASinistra=2048

;attach to window's top
#AttaccaAllaFinestraInAlto=4096

;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192

;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384

;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;the following constants state window events
;--------------------------------------------

;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8

;you have moved the mouse
#HaiMossoIlTopo=16

;you have pressed a gadget
#HaiPremutoUnBottone=32

;you have released a gadget
#HaiRilasciatoUnBottone=64

;you have activated the menu
#HaiAttivatoIlMenu=256

;you have closed the window
#HaiChiusoLaFinestra=512

;you have pressed a key
#HaiPremutoUnTasto=1024

;--------------------------------------------------------
;le seguenti costanti indicano i tasti cliccati del topo
;the following constants state the clicked mouse buttons
;--------------------------------------------------------

;left mouse button pressed
#TastoSinistroDelTopoPremuto=1

;right mouse button pressed
#TastoDestroDelTopoPremuto=2

;both mouse buttons pressed
#EntrambiITastiDelTopoPremuti=3

;left mouse button released
#TastoSinistroDelTopoRilasciato=5

;right mouse button released
#TastoDestroDelTopoRilasciato=6

;both mouse buttons released
#EntrambiITastiDelTopoRilasciati=7

;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti cursore
;the following constants state the ascii value for the Backspace, Esc and
; cursor keys
;-------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31

;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64

;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8

;screen
#Schermo=0

;main window
#FinestraPrincipale=0

;main window's gadget list
#ListaGadgetPrincipale=0

;main window's menu list
#ListaMenuPrincipale=0

;sounds editor window
#FinestraEditoreSuoni=1

;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1

;sound editor window's menu list
#ListaMenuEditoreSuoni=1

;notes editor window
#FinestraEditoreSequenza=2

;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2

;notes editor window's menu list
#ListaMenuEditoreSequenza=2

;note editor window's zonetable
#TabellaZoneEditoreSequenza=0

;window to change basic note length
#FinestraCambioEventoBase=3

;basic note length change window's gadget list
#ListaGadgetCambioEventoBase=3

;slider editore suoni, valore utile qualsiasi maggiore di zero
;sounds editor's slider, useful value any greater than zero
#SliderEditoreSuoni=1

;basic note change window's zonetable
#TabellaZoneCambioEventoBase=1

;background pic's bitmap
#BitmapImmagineDiSfondo=0

;-------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati agli
; eventi musicali
;these constants states different changes that can be applied to musical
; events
;--------

;select a musical event
#SelezionaUnEventoMusicale=0

;change the channel of the selected musical events
#CambiaIlCanaleDegliEventiMusicaliSelezionati=1

;increase by one the value of the selected musical events
#AlzaDiUnoGliEventiMusicaliSelezionati=2

;decrease by one the value of the selected musical events
#AbbassaDiUnoGliEventiMusicaliSelezionati=3

;move forward the selected musical events
#SpostaAvantiNelTempoGliEventiMusicaliSelezionati=4

;move backward the selected musical events
#SpostaIndietroNelTempoGliEventiMusicaliSelezionati=5

;delete the selected musical events
#EliminaGliEventiMusicaliSelezionati=6

;select all the musical events
#SelezionaTuttiGliEventiMusicali=7

;deselect all the musical events
#DeselezionaTuttiGliEventiMusicali=8

;toggle selection of all musical events
#InvertiLaSelezioneDiTuttiGliEventiMusicali=9

;cut all the selected musical events
#TagliaGliEventiMusicaliSelezionati=10

;copy all the selected musical events
#CopiaGliEventiMusicaliSelezionati=11

;paste the previous cutted or copied musical events
#IncollaGliEventiMusicali=12

;forget the previous cutted or copied musical events
#DimenticaGliEventiMusicaliTagliatiOCopiati=13

;select same kind's musical events with the same channel
#SelezionaGliEventiMusicaliUguali=14

;add 8 to the event value of the selected musical events that are not notes
; and are not beats per minute
#AggiungiOttoAgliEventiMusicaliSelezionati=15

;sub 8 to the event value of the selected musical events that are not notes
; and are not beats per minute
#SottraiOttoAgliEventiMusicaliSelezionati=16

;add 10 to the event value of the selected beats per minute (BPM) events
#AggiungiDieciAgliEventiMusicaliSelezionati=17

;sub 10 to the event value of the selected beats per minute (BPM) events
#SottraiDieciAgliEventiMusicaliSelezionati=18

;put up of one octave the selected notes
#AlzaDiUnOttavaLeNoteSelezionate=19

;put down of one octave the selected notes
#AbbassaDiUnOttavaLeNoteSelezionate=20

;change the value of the selected musical events, that is velocity for notes
#CambiaIlValoreDegliEventiMusicaliSelezionati=21

;increase the selected notes length
#AllungaLaDurataDelleNoteSelezionate=22

;decrease the selected notes length
#RiduciLaDurataDelleNoteSelezionate=23

;add a beat to the selected time signature events
#AggiungiUnBattitoAlTempoSelezionato=24

;sub a beat to the selected time signature events
#TogliUnBattitoAlTempoSelezionato=25

;add a measure to the selected time signature events
#AggiungiUnaMisuraAlTempoSelezionato=26

;sub a measure to the selected time signature events
#TogliUnaMisuraAlTempoSelezionato=27

;go to the insertion point
#VaiAlPuntoDInserimento=28

;-----------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle sequenze visualizzate
;the following constants state the displayed sequences drawing mode
;-------------------------------------------------------------------

;unselected sequence
#SequenzaNonSelezionata=0

;selected sequence
#SequenzaSelezionata=1

;highlighted sequence
#SequenzaEvidenziata=2

;----------------------------------------------------------------------------
;le seguenti costanti indicano lo stato che un evento musicale puo' assumere
;the following constants state the status that a musical event can be
;---------------------------------------------------------------------

;unselected musical event
#EventoMusicaleNonSelezionato=0

;selected musical event
#EventoMusicaleSelezionato=1

;cutted musical event
#EventoMusicaleTagliato=2

;copied musical event
#EventoMusicaleCopiato=4

;played musical event
#EventoMusicaleEseguito=8

;ended musical event
#EventoMusicaleTerminato=16

;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------

;play events from the main window
#EseguiGliEventiMusicaliDallaFinestraPrincipale=0

;play events from the sequence editor
#EseguiGliEventiMusicaliDallEditoreSequenza=1

;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode
; selection
;-----------

;one colour with transparent background
#UnColoreConSfondoTrasparente=0

;two colours with full background
#DueColoriConSfondoPieno=1

;second time same colour
#SecondaVoltaStessoColore=2

;--------------------------------------------------------------
;le seguenti costanti indicano il tempo base che e' 4/4, cioe'
; #BattitiDiBase/#MisureDiBase
;the following constants states the basic time that is 4/4, that is
; #BattitiDiBase/#MisureDiBase
;------------------------------

;basic beats
#BattitiDiBase=4

;basic measures
#MisureDiBase=4

;basic ticks per quarter note
#TicDiBasePerQuarto=192

;basic ticks per sixtyfourth note
#TicDiBasePerSessantaquattresimo=#TicDiBasePerQuarto/16

;tracks maximum
#MassimoTracce=1024

;sequences maximum
#MassimoSequenze=32768

#LarghezzaPulsantiEditoreSequenza=16*16+5*8

;------------------------
;File identifier numbers
;------------------------

;MIDI Files history
#StoriaDeiFileMIDI=0

;MIDI file to load
#FileMIDIDaCaricare=0

;          font height, notes invisible area,   selected channel, note increment y, basic event,musical event moved by mouse
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,IncrementoYNota,  EventoBase, EventoMusicaleSpostatoConIlTopo

;          speech enabled, clicked mouse key,   ticks per beat
DEFTYPE .b ParlatoAttivato,TastoDelTopoCliccato,TicPerBattito

;          visible tracks,AMIGA voice off,visible area start y
DEFTYPE .b TracceVisibili,VoceSpenta,     YInizioAreaVisibile

;          editor window inner height,           editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza

;          main window inner height,        main window inner width
DEFTYPE .w AltezzaInternaFinestraPrincipale,LarghezzaInternaFinestraPrincipale

;          screen height, values visible area,  Active channels,screen height,   slider width, bars per mins backgroun
DEFTYPE .w AltezzaSchermo,AreaVisibileDeiValori,CanaliAttivati,LarghezzaSchermo,XLunSlider,    XPosSfondoBattutePerMinuto

;          mouse x, slider height, tempo background y, bars per mins background y, mouse y
DEFTYPE .w XTopo,   YLunSlider,    YPosSfondoTempo,    YPosSfondoBattutePerMinuto, YTopo

;          time invisible area,   sequence duration,events,selected events,  MIDI enabled,insertion point,  visible area start x
DEFTYPE .l AreaInvisibileDelTempo,DurataSequenza,   Eventi,EventiSelezionati,MIDIAttivato,PuntoDInserimento,XInizioAreaVisibile

;-----
;keys
;-----

;backspace key
TastoBackspace$=Chr$(#Backspace)

;escape key
TastoFuga$=Chr$(#Escape)

;cursor up key
TastoCursoreSu$=Chr$(#CursorUp)

;cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)

;cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)

;cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)

;space key
Spazio$=" "

;----------------------------------------------------------
;questa variabile riporta la parte non visibile del motivo
;this variable reports the non visible motive area
;--------------------------------------------------
AreaInvisibileDelMotivo.l=0

;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars per minute
;-----------------------------------------------------------------------------
BattutePerMinuto.w=120

;-----------------------------------------------------
;questa variabile indica i battiti correnti del tempo
;this variable states the time's current beats
;----------------------------------------------
Battiti.b=#BattitiDiBase

;----------------------------------------------------------------------------
;la seguente variabile permette la selezione delle due diverse tavolozze dei
; colori; se vera (true), i colori saranno quelli originali, se falsa (false)
; saranno quelli dell'immagine di sfondo a colori
;the following variable permits the selection of the two different colour
; palettes; if true the colours will be as original, if false they will be
; the ones from the coloured pic
;--------------------------------
ColoriOriginali.b=False

;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12), cioe' la radice dodicesima di 2
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectively the following note or the previous note and
; corresponds to 2^(1/12), that is the twelfth root of 2
;--------------------------------------------------------
DistanzaSemitono.f=1.05946309

;------------------------------------------------------------------------------
;questa variabile, diventando vera (true), vi permette di uscire dal programma
;this variable, becaming True, let you exit from the program
;------------------------------------------------------------
EsciDalProgramma.b=False

EventoMusicaleSelezionato.w=0
;----------------------------------------------------------------------------
;questa variabile viene usata solo dalla procedura di selezione degli eventi
; musicali e il suo valore viene usato per la selezione degli eventi uguali.
;this variable is used only by the musical events selection procedure and its
; value is used by the alike musical events selection.
;------------------------------------------------------

;------------------------------------------
;questa variabile indica la fine del brano
;this variable states song end
;------------------------------
FineMotivo.l=0

;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False

;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaEventoBase.w=#TicDiBasePerQuarto

;-----------------------------------------------------
;questa variabile indica le misure correnti del tempo
;this variable states the time's current measures
;-------------------------------------------------
Misure.w=#MisureDiBase

;--------------------------------------------------------------------------
;questa variabile indica se gli eventi musicali dello stesso canale devono
; essere mostrati da soli nell'editore sequenza
;this variable states if the same channel musical events must be shown alone
; in the sequence editor
;------------------------
MostraSoloGliEventiMusicaliDelCanaleSelezionato.b=False

;------------------------------------------------------------------------
;questa variabile indica se gli eventi musicali dello stesso tipo devono
; essere mostrati da soli nell'editore sequenza
;this variable states if the same kind musical events must be shown alone in
; the sequence editor
;---------------------
MostraSoloGliEventiMusicaliDelloStessoTipo.b=False

;----------------------------------------------------------------------------
;questa variabile indica se deve essere mostrato il nuovo valore dell'evento
; selezionato mosso con il mouse
;this variable states if the new value of the selected event dragged by mouse
; must be showed or not
;-----------------------
MostraNuovoValore.b=False

;---------------------------------------------------------------------------
;questa variabile sara' maggiore di zero se una nota non e' stata terminata
;this variable will be greater than zero if one or more notes have not been
; terminated
;------------
NoteSuonate.l=0

;--------------------------------------------------------------------
;questa variabile indica l'ottava visualizzata nell'editore sequenza
;this variable states the visualized octave in the sequence editor
;------------------------------------------------------------------
OttavaSelezionata.b=#_MiddleC/12

;--------------------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delgi eventi musicali
; dell'editore sequenza
;this variable states the musical events visualization scale of the sequence
; editor
;--------
ScalaEventiMusicali.w=1

;-------------------------------------------------------------------
;Questa variabile indica il numero massimo della sequenza da creare
;This variable states the maximum number of the sequence to create
;------------------------------------------------------------------
SequenzaMassimaDaCreare.l=1

;--------------------------------------------------------------------------
;questa variabile indica la sequenza selezionata; se contiene zero nessuna
; sequenza e' selezionata, altrimenti contiene il numero positivo che
; identifica la sequenza
;this variable states the selected sequence; if retains zero no sequence is
; selected, otherwise retain the positive number that identifies the sequence
;-----------------------------------------------------------------------------
SequenzaSelezionata.l=0

;-------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 file midi caricati e'
; stata scritta
;this flag states if the last 5 loaded MIDI files list has been written
;-----------------------------------------------------------------------
StoriaDeiFileMIDIAperti.b=False

;------------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tic; questa costante indica quanti
; tic passano in un 50mo di secondo per un tempo di 120 battute per minuto
;The basic note, the quarter, corresponds to 192 ticks; this constant signs
; how many ticks takes passes in a 50th of a second for a time of 120 measures
; per minutes
;-------------
TicPerCinquantesimoDiSecondo.f=30.72

;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current musical event; at the
; beginning is set on the note event
;------------------------------------
TipoDiEventoMusicaleDiBase$="Note"

;------------------------------------------------------------------------------
;questa variabile indica per le note la velocita' di base e per i controlli il
; valore di base; valore utile da zero a 127
;this variable states for the notes the basic velocity and for the controls
; the basic value; useful value from zero to 127
;------------------------------------------------
ValoreEventoBase.b=64

;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4

;-------------------------------------------------------------------------
;questa variabile indica la voce dell'AMIGA che non e' attiva; ogni "uno"
; corrisponde ad una voce di Amiga
;this variable states the Amiga voice that is not active; each "one" is
; related to an AMIGA voice
;---------------------------
VoceSpenta=%1111

;---------------------------------------------------------------------------
;questa variabile indica la posizione d'inizio per la visualizzazione delle
; tracce
;this variables states the start position for the tracks displacement
;---------------------------------------------------------------------
XTracceVisibili.l=0

;------------------------------------------------------------
;questa variabile memorizza la prima traccia da visualizzare
;this variable stores the first track to be displayed
;-----------------------------------------------------
YTracceVisibili.w=0

;---------------------------------------------------------------------------
;queste cinque variabili indicizzate conterranno i nomi degli ultimi 5 file
; MIDI caricati
;this five indexed variables will keep names of last 5 loaded MIDI files
;------------------------------------------------------------------------
Dim FileMIDIAperto$(4)

;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq

;--------
;periode
;--------
 Periodo.l

;----------
;frequency
;----------
 Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)

;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota

;note italian name
 NomeItaliano$

;note english name
 NomeInglese$

;diesis flag
 Diesis.b

;note octave
 Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)

;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni per l'AMIGA
;the following variables structure is for AMIGA sounds management
;-----------------------------------------------------------------
NEWTYPE .Suono

;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
 Nome$

;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16, o zero se nessun canale e' associato al suono
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16, or zero if no channel is assigned to the sound
;--------------------------------------------------------------
 Canale.b

End NEWTYPE
Dim Suono.Suono(31)

NEWTYPE .Sequenza

;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$

;-----------------------------------------------------------
;questa variabile indica la durata temporale della sequenza
;this variable states the sequence time duration
;------------------------------------------------
Durata.l

;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
EventiMusicali.l

;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiMusicaliSelezionati.l

End NEWTYPE
Dim List Sequenza.Sequenza(#MassimoSequenze-1)

NEWTYPE .SequenzaNellaTraccia

;----------------------------------------------------
;questa variabile memorizza il numero della sequenza
;this variable stores the sequence number
;-----------------------------------------
Sequenza.l

;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l

;------------------------------------------------------------------
;questa variabile indica la traccia di appartenenza della sequenza
;this variable states the the track of the sequence
;---------------------------------------------------
Traccia.w

;------------------------------------------------------------
;questa variabile indica se la sequenza e' genitore o figlia
;this variable states if the sequence is parent or daughter
;-----------------------------------------------------------
Genitore.l

End NEWTYPE
Dim List SequenzaNellaTraccia.SequenzaNellaTraccia(#MassimoSequenze-1)

;existing sequence
Dim SequenzaEsistente.b(#MassimoSequenze-1)

;------------------------------------------------------------------------
;queste variabili indicizzate indicano True (Vero) se la traccia esiste,
; altrimenti indicano False (Falso)
;these indexed variables (arrays) state True if track exist, otherwise state
; False
;-------
Dim Traccia.b(#MassimoTracce-1)

;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale

;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
 Tipo$

;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
 Evento.b

;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead it is a control it states its value
;------------------------------------------------------------
 Valore.b

;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
 Inizio.l

;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
 Durata.l

;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
 Canale.b

;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 32768
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 32768
;-----------------------
 Sequenza.l

;----------------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato, tagliato
; copiato, eseguito o terminato, piu' precisamente:
; 0=evento non selezionato
; 1=evento selezionato
; +2=evento tagliato
; +4=evento copiato
; +8=evento eseguito
; +16=evento terminato
;this variable states if the musical event has been selected, cutted, copied
; executed or terminated, more precisely:
; 0=unselected event
; 1=selected event
; +2=cutted event
; +4=copied event
; +8=executed event
; +16=ended event
;-----------------
 Stato.b

End NEWTYPE

DEFTYPE .EventoMusicale NotaSuonata

;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)

;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)

;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispositivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0

;------------------------------------------------------------------------------
;questa variabile indica se si entra nell'editore sequenza per la prima volta,
; per mostrare i requester che riportano i tasti utili
;this variable states if you enters in the sequence editor for the first time,
; to show the requesters that report the useful keys
;----------------------------------------------------
PrimaVoltaNellEditoreSequenza.b=True

;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
 AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement

;------------------------------------------------------------
;questa procedura imposta il parlato dell'AMIGA se possibile
;this procedure sets the AMIGA speech if it is possible
;-------------------------------------------------------
Statement ImpostaIlParlatoDellAmiga{}
SHARED ParlatoAttivato
 If Exists("LIBS:translator.library") AND Exists("DEVS:narrator.device")
  SetVoice 130,250,0,1,64,22200
  Speak "Speech is enabled!"
  ParlatoAttivato=True
 Else
  Messaggio$="Unable to set speech,|"
  Messaggio$+"required files:|"
  Messaggio$+"LIBS:translator.library|"
  Messaggio$+"DEVS:narrator.device|"
  Messaggio$+"These are supplied with|"
  Messaggio$+"the workbench 1.2|"
  Messaggio$+"Search on Aminet their|"
  Messaggio$+"third part improvement|"
  EZRequest "AmySequencer message",Messaggio$,"OK"
  ParlatoAttivato=False
 EndIf
End Statement

;-----------------------------------------------
;questa procedura carica le immagini delle note
;this procedure loads the note images
;-------------------------------------
Statement CaricaLeImmaginiDelleNote{}
 BitMap 0,126,16,1
 LoadBitMap 0,"Notes.2Cols"
 GetaShape 0,0,0,22,16
 GetaShape 1,23,0,12,16
 GetaShape 2,36,0,12,16
 GetaShape 3,49,0,17,16
 GetaShape 4,67,0,17,16
 GetaShape 5,85,0,17,16
 GetaShape 6,103,0,17,16
 GetaShape 7,121,0,6,16
 Free BitMap 0
End Statement

;----------------------------------------------
;questa procedura attiva la comunicazione MIDI
;this procedure activates the MIDI communication
;------------------------------------------------
Statement AttivaMIDI{}
SHARED MIDIAttivato
SHARED Spazio$
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 Repeat
  If MIDIAttivato=True Then CloseSerial 0
  WLocate 0,0:WColour 0,0:Print SPACE$(80)
  WLocate 0,0:WColour 3,0:Print "Please type your MIDI device name>"
  DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(Spazio$)),Asc(Spazio$))
  WLocate 0,0:Print SPACE$(80)
  If DispositivoMIDI$<>""
   MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
   If MIDIAttivato=0
    EZRequest "AmySequencer message","Unable to open MIDI|on "+DispositivoMIDI$,"OK"
   Else
    SetSerialBuffer 0,64
    MIDIAttivato=True
   EndIf
  EndIf
 Until MIDIAttivato=True
 EZRequest "AmySequencer message","MIDI has been activated|on "+DispositivoMIDI$,"OK"
 WJam #UnColoreConSfondoTrasparente
End Statement

;-----------------------------------------------------------------
;questa procedura ricava l'esponente in base 2 della battuta data
;this procedure returns the base two exponent of the given bar
;--------------------------------------------------------------
Function .b EsponenteDiDue{Misura.w}
 Misura=Min(Max(Misura,1),128)
 Repeat
  If Misura>1
   Misura/2:Esponente+1
   If Misura>1 AND Misura MOD 2>0 Then Misura+1
  EndIf
 Until Misura=1
Function Return Esponente
End Function

;-------------------------------------------------
;questa procedura cambia la misurazione del tempo
;this procedure change the time misuration
;------------------------------------------
Statement CambiaLaMisuraDelTempo{}
SHARED Battiti
SHARED Misure
SHARED Spazio$
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3,0:Print "Please type the basic time beats>"
 NuoviBattiti.w=Val(StripLead$(StripTrail$(Edit$(Str$(#BattitiDiBase),48),Asc(Spazio$)),Asc(Spazio$)))
 Battiti=Min(Max(NuoviBattiti,1),16)
 WLocate 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3,0:Print "Please type the basic time measures>"
 NuoveMisure.w=Val(StripLead$(StripTrail$(Edit$(Str$(#MisureDiBase),44),Asc(Spazio$)),Asc(Spazio$)))
 Misure=2^EsponenteDiDue{NuoveMisure}
 WJam #UnColoreConSfondoTrasparente
End Statement

;------------------------------------------------------
;questa procedura mostra il tempo in battiti su misure
;this procedure shows the tempo by beats per measures
;-----------------------------------------------------
Statement MostraIlTempo{Tempo.b,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 WJam #DueColoriConSfondoPieno
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  XMessaggio.w=(80-Len("Tempo=00/000"))*8
  YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(Len("Tempo=00/000"))
  WBlit 9,XPosSfondoTempo,YPosSfondoTempo
  WJam #UnColoreConSfondoTrasparente:WColour 3
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  WColour CanaleEvento-1,16-CanaleEvento
  XMessaggio=#LarghezzaPulsantiEditoreSequenza
  YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
  Print SPACE$(80-XMessaggio/8)
 EndIf
 WLocate XMessaggio,YMessaggio
 Print "Tempo=",(Tempo MOD 16)+1,"/",2^(Tempo/16)
End Statement

;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in bars per minute
;------------------------------------------------
Statement MostraLeBattutePerMinuto{BattutePerMinuto.w,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
 TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
 WJam #DueColoriConSfondoPieno
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  XMessaggio.w=0
  YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(Len("BPM=000-ticks/50th=000.0"))
  WBlit 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto
  WJam #UnColoreConSfondoTrasparente:WColour 3
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  WColour CanaleEvento-1,16-CanaleEvento
  XMessaggio=#LarghezzaPulsantiEditoreSequenza
  YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
  Print SPACE$(80-XMessaggio/8)
 EndIf
 WLocate XMessaggio,YMessaggio
 Format "000":Print "BPM=",BattutePerMinuto
 Format "000.0":Print"-ticks/50th=",TicPerCinquantesimoDiSecondo
 Format ""
End Statement

;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()

;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
 OttavaDellaNota.b=Nota/12

 TipoDiNota(Nota)\Ottava=OttavaDellaNota

;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
 NotaNellOttava.b=Nota MOD 12

 Select NotaNellOttava

;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
 Case 0
  TipoDiNota(Nota)\NomeItaliano="Do"
  TipoDiNota(Nota)\NomeInglese="C"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
 Case 1
  TipoDiNota(Nota)\NomeItaliano="Do#"
  TipoDiNota(Nota)\NomeInglese="C#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
 Case 2
  TipoDiNota(Nota)\NomeItaliano="Re"
  TipoDiNota(Nota)\NomeInglese="D"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
 Case 3
  TipoDiNota(Nota)\NomeItaliano="Re#"
  TipoDiNota(Nota)\NomeInglese="D#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
 Case 4
  TipoDiNota(Nota)\NomeItaliano="Mi"
  TipoDiNota(Nota)\NomeInglese="E"
  TipoDiNota(Nota)\Diesis=False

;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
 Case 5
  TipoDiNota(Nota)\NomeItaliano="Fa"
  TipoDiNota(Nota)\NomeInglese="F"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
 Case 6
  TipoDiNota(Nota)\NomeItaliano="Fa#"
  TipoDiNota(Nota)\NomeInglese="F#"
  TipoDiNota(Nota)\Diesis=True

;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
 Case 7
  TipoDiNota(Nota)\NomeItaliano="Sol"
  TipoDiNota(Nota)\NomeInglese="G"
  TipoDiNota(Nota)\Diesis=False

;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
 Case 8
  TipoDiNota(Nota)\NomeItaliano="Sol#"
  TipoDiNota(Nota)\NomeInglese="G#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
 Case 9
  TipoDiNota(Nota)\NomeItaliano="La"
  TipoDiNota(Nota)\NomeInglese="A"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
 Case 10
  TipoDiNota(Nota)\NomeItaliano="La#"
  TipoDiNota(Nota)\NomeInglese="A#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
 Case 11
  TipoDiNota(Nota)\NomeItaliano="Si"
  TipoDiNota(Nota)\NomeInglese="B"
  TipoDiNota(Nota)\Diesis=False

 End Select
End Statement

Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;-------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 4a
; ottava (la prima e' l'ottava zero), la cui frequenza e' nota e la si
; moltiplica o divide per la distanza minima tra due note che e' il semitono;
; per ottenere il periodo si divide una delle costanti di temporizzazione, a
; seconda che il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza
; della nota; queste costanti sono riportate sul MANUALE DI RIFERIMENTO PER
; L'HARDWARE AMIGA
;to obtain all 128 notes it starts from the A from the 4rd octave (the 1st is
; the zero octave) that has a known frequency, and it multiply or divide this
; for the minimum distance between two notes that is the semitone; to obtain
; the period it divides one of the timing constants, depending on your AMIGA
; uses a PAL or NTSC screen, for the note frequency; these constants are
; reported on the AMIGA HARDWARE REFERENCE MANUAL
;-------------------------------------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
 PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
 PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}

For Nota.w=46 To 127
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota

For Nota=44 To 0 Step -1
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement

;------------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, battiti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che, se vera, parte da zero
;the following procedure converts a time value from ticks into bars, beats and
; ticks; the OrigineZero variable is used for the different note length
; displacement that, if this is true, starts from zero instead of starting
; from one
;----------
Statement ConvertiIlTempoInBattute{Tempo.l,Origine.b}
SHARED Battiti
SHARED Misure
 Battuta.l=Tempo/((#TicDiBasePerQuarto*4.0*Battiti)/Misure)
 Battito.b=(Tempo/(#TicDiBasePerQuarto/(Misure/4.0))) MOD Battiti
 If Origine=1 Then Battuta+1:Battito+1
 Print Battuta,".",Battito
 Tic.w=Tempo MOD (#TicDiBasePerQuarto/(Misure/4.0))
 If Tic>0 Then Print ".",Tic
End Statement

;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
 If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
 PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement

;------------------------------------------------
;questa procedura mostra le barre di scorrimento
;this procedure showss the sliders
;----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 If Orientamento$="VERTICAL"
  SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 Redraw FinestraSlider,Slider
End Statement

;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
 EndIf
 If Orientamento$="VERTICAL"
  ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
 EndIf
 ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
 If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
 If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
 ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
 Function Return ValoreIndicatoDalloSlider
End Function

;---------------------------------------------------------------------------
;questa procedura cancella il file storico degli ultimi 5 MIDI file  aperti
;this procedure clears the last 5 loaded MIDI files history file
;----------------------------------------------------------------
Statement CancellaLaStoriaDeiFileMIDIAperti{}
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED VoceMenuEsci
 KillFile "LoadedMIDIFilesHistory"
 For FileMIDIAperto.b=0 To 4
  FileMIDIAperto$(FileMIDIAperto)=""
 Next FileMIDIAperto
 StoriaDeiFileMIDIAperti=False
 VoceMenuEsci=4
End Statement

;------------------------------------------------------------------------
;questa procedura carica il file storico degli ultimi 5 file MIDI aperti
;this procedure loads the last 5 loaded MIDI files history file
;---------------------------------------------------------------
Statement CaricaLaStoriaDeiFileMIDIAperti{}
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED VoceMenuEsci
 StoriaDeiFileMIDIAperti=ReadFile(#StoriaDeiFileMIDI,"LoadedMIDIFilesHistory")
 If StoriaDeiFileMIDIAperti=True AND Lof(#StoriaDeiFileMIDI)>0

  For FileMIDIAperto.b=0 To 4
   FileMIDIAperto$(FileMIDIAperto)=""
  Next FileMIDIAperto

  FileInput #StoriaDeiFileMIDI
  FileMIDIAperto=0
  VoceMenuEsci=4

  Repeat
   Dato$=Inkey$
   If Dato$=Chr$(10)
    FileMIDIAperto+1
    VoceMenuEsci+1
   Else
    FileMIDIAperto$(FileMIDIAperto)+Dato$
   EndIf
  Until Dato$=""

  CloseFile #StoriaDeiFileMIDI
  PopInput

 Else
  StoriaDeiFileMIDIAperti=False
 EndIf
End Statement

;------------------------------------------------------------------
;crea la bitmap per l'immagine di sfondo della finestra principale
;creates the bitmap for the background pic of the main window
;-------------------------------------------------------------
Statement CreaLaBitmapPerLImmagineDiSfondo{}

;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
 BitMap #BitmapImmagineDiSfondo,640,240,4

End Statement

;-------------------------------------------------------------------
;carica l'immagine di sfondo della finestra principale nella bitmap
;loads the background pic of the main window into the bitmap
;------------------------------------------------------------
Statement CaricaLImmagineDiSfondoNellaBitmap{}
SHARED ColoriOriginali

If ColoriOriginali=True
 ImmagineDiSfondo$="BackPicOC.16Cols"
Else
 ImmagineDiSfondo$="BackPic.16Cols"
EndIf

;----------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata
; per questa
;loads the main window background image into the bitmap creted for it
;---------------------------------------------------------------------
 LoadBitMap #BitmapImmagineDiSfondo,ImmagineDiSfondo$,#TavolozzaDeiColori

;---------------------------------------------------
;usa la tavolozza dei colori dell'immagine caricata
;use loaded image colours palette
;---------------------------------
 Use Palette #TavolozzaDeiColori

End Statement

;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED TracceVisibili

;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
 Use IntuiFont #FonteDiCaratteriTopaz8

;------------------------------------
;inizializza la tavolozza dei colori
;initializes the colours palette
;--------------------------------
 InitPalette #TavolozzaDeiColori,16

;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
;  Read Rosso.b
;  Read Verde.b
;  Read Blu.b
;  PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore

;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
 ScreenPens 3,2,0,1,3,1,2

;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
 Screen #Schermo,4+8,"AmySequencer 0.21 (Fri, 23 Apr 2004) by Stefano Maria Regattin"

;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
 Use Palette #TavolozzaDeiColori

;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
 IndirizzoSchermo.l=Peek.l(Addr Screen(0))

;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
 LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)

;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
 AltezzaSchermo=Peek.w(IndirizzoSchermo+14)

;-------------------------------------------------------------
;questa variabile indica il massimo numero di tracce visibili
;this variable states the visible tracks maximum number
;-------------------------------------------------------
 TracceVisibili=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8

End Statement

;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the  background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;---------------------------------------------------------
;copia l'immamgine dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
 BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240

End Statement

;-------------------------------------------------------------------------
;this procedure stores the background portion under the main window tempo
; displacement
;--------------
Statement CopiaLoSfondoSottoAlTempo{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 XPosSfondoTempo=LarghezzaInternaFinestraPrincipale-1-(Len("Tempo=00/000")*8-1)
 YPosSfondoTempo=AltezzaInternaFinestraPrincipale-8-8
 XLunSfondoTempo.b=Len("Tempo=00/000")*8
 YLunSfondoTempo.b=8
 GetaShape 9,XPosSfondoTempo,YPosSfondoTempo,XLunSfondoTempo,YLunSfondoTempo
End Statement

;----------------------------------------------------------------------------
;this procedure stores the background portion under the main window bars per
; minute displacement
;---------------------
Statement CopiaLoSfondoSottoAlleBattutePerMinuto{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
 XPosSfondoBattutePerMinuto=0
 YPosSfondoBattutePerMinuto=AltezzaInternaFinestraPrincipale-8-8
 XLunSfondoBattutePerMinuto.w=Len("BPM=000-ticks/50th=000.0")*8
 YLunSfondoBattutePerMinuto.b=8
 GetaShape 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto,XLunSfondoBattutePerMinuto,YLunSfondoBattutePerMinuto
End Statement

;-----------------------------------------------------------
;questa procedura imposta la finestra principale invisibile
;this procedure sets the main invisible window
;----------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraPrincipale
SHARED AltezzaSchermo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED LarghezzaSchermo
SHARED StoriaDeiFileMIDIAperti
SHARED TracceVisibili
SHARED XLunSlider
SHARED YLunSlider

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1

 MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
 LarghezzaInternaFinestraPrincipale.w=InnerWidth

;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
 AltezzaInternaFinestraPrincipale.w=InnerHeight

 CloseWindow #FinestraPrincipale

;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;--------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale
 YLunSlider=8
 ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to show the sequences
;---------------------------------------------------
 XLunSlider=16
 YLunSlider=TracceVisibili*8
 ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to show the sequences
;---------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale-16
 YLunSlider=4
 ImpostaSlider{3,16,8+TracceVisibili*8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #UnColoreConSfondoTrasparente

;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
 EZOutput #FinestraPrincipale

 FinestraPrincipaleAperta=True

End Statement

;------------------------------------------------------------
;questa procedura imposta il menu' della finestra principale
;this procedure sets the main window menu
;-----------------------------------------
Statement ImpostaIlMenuDellaFinestraPrincipale{}
SHARED ColoriOriginali
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED VoceMenuEsci

;-------------------------------------------
;elimina il menu' della finestra principale
;delete the main window menu
;----------------------------
 Free MenuList #ListaMenuPrincipale

;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
 MenuTitle #ListaMenuPrincipale,0,"Song"
 MenuItem #ListaMenuPrincipale,0,0,0,"New"
 MenuItem #ListaMenuPrincipale,0,0,1,"Load"
 MenuItem #ListaMenuPrincipale,0,0,2,"Save"
 MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
 If StoriaDeiFileMIDIAperti=True
  For FileMIDIAperto.b=4 To VoceMenuEsci-1
   FileMIDI$=FileMIDIAperto$(FileMIDIAperto-4)
   IndirizzoNomeFileMIDIAperto.l=FilePart_(FileMIDI$)
;   PercorsoFileMIDIAperto$=UnLeft$(FileMIDI$,Len(Peek$(IndirizzoNomeFileMIDIAperto)))
   NomeFileMIDIAperto$=Right$(FileMIDI$,Len(Peek$(IndirizzoNomeFileMIDIAperto)))
   If Len(NomeFileMIDIAperto$)>30 Then NomeFileMIDIAperto$="..."+Right$(NomeFileMIDIAperto$,27)
   MenuItem 0,0,0,FileMIDIAperto,NomeFileMIDIAperto$
  Next FileMIDIAperto
 EndIf
 MenuItem 0,0,0,VoceMenuEsci,"Quit"

;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
 MenuTitle #ListaMenuPrincipale,1,"Controls"
 MenuItem #ListaMenuPrincipale,0,1,0,"Play"
 MenuItem #ListaMenuPrincipale,0,1,1,"Record"
 MenuItem #ListaMenuPrincipale,0,1,2,"Stop"

;---------------------------
;imposta il menu' Sequences
;sets Sequences menu
;--------------------
 MenuTitle #ListaMenuPrincipale,2,"Sequence"
 MenuItem #ListaMenuPrincipale,0,2,0,"Edit"
 MenuItem #ListaMenuPrincipale,0,2,1,"Name"

;------------------------
;imposta il menu' Sounds
;sets Sounds menu
;-----------------
 MenuTitle #ListaMenuPrincipale,3,"Sounds"
 MenuItem #ListaMenuPrincipale,0,3,0,"Edit"

;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
 MenuTitle #ListaMenuPrincipale,4,"Prefs"
 MenuItem #ListaMenuPrincipale,0,4,0,"Set MIDI device"
 If ColoriOriginali=True Then Colori.b=3 Else Colori=1
 MenuItem #ListaMenuPrincipale,Colori,4,1,"  Original colours"
 MenuItem #ListaMenuPrincipale,0,4,2,"Clear loaded MIDI files history"

;---------------------------------
;seleziona la finestra principale
;selects the main window
;------------------------
 Use Window #FinestraPrincipale

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuPrincipale

End Statement

;---------------------------------------------------------------------------
;questa funzione converte il valore dato se oltre 127 in un valore negativo
;this function converts the given value if over 127 into the negative
; equivalent
;------------
Function.b ConvertiOltreCentoventisetteInNegativo{Dato.w}
 If Dato>127 Then Dato-256
 DatoConvertito.b=Dato
 Function Return DatoConvertito
End Function

;--------------------------------------------------------------------------
;questa e' la funzione del panico: Premete il TASTO SINISTRO DEL MOUSE per
; rallentare la conversione del file MIDI in caricamento o premete il TASTO
; DESTRO DEL MOUSE per annullare la conversione
;this is the panic function: press the LEFT MOUSE BUTTON to slow the
; conversion of the MIDI file loading or press the RIGHT MOUSE BUTTON to abort
; the conversion
;----------------
Function .b Panico{}
 Select Joyb(0)
 Case #TastoSinistroDelTopoPremuto
  Delay_ 50:Panico.b=True
; Case #TastoDestroDelTopoPremuto
;  Panico=False
; Case #EntrambiITastiDelTopoPremuti
 End Select
 Function Return Panico
End Statement

;-------------------------------------
;questa procedura carica un file MIDI
;this procedure loads a MIDI file
;---------------------------------
Statement CaricaUnFileMIDI{NomeDelFileMIDI$}
SHARED Battiti
SHARED EventoMusicale()
SHARED FileMIDIAperto$()
SHARED HeaderMarker$
SHARED Misure
SHARED Sequenza()
SHARED SequenzaEsistente()
SHARED SequenzaMassimaDaCreare
SHARED SequenzaNellaTraccia()
SHARED Spazio$
SHARED StoriaDeiFileMIDIAperti
SHARED Traccia()
SHARED TrackMarker$
 MaxLen P$=160
 MaxLen F$=64
 If NomeDelFileMIDI$=""
  NomeDelFileMIDI$=FileRequest$("Load a MIDI file",P$,F$)
 Else
  CaricatoDalMenu.b=True
 EndIf
 If NomeDelFileMIDI$<>""
  FileMIDIAperto.b=ReadFile(#FileMIDIDaCaricare,NomeDelFileMIDI$)
  If FileMIDIAperto=True
   FileInput #FileMIDIDaCaricare
   ResetList Sequenza()
   ResetList SequenzaNellaTraccia()
   MarcatoreIniziale$=Inkey$(4)
   If MarcatoreIniziale$=HeaderMarker$
    WJam #DueColoriConSfondoPieno
    WLocate 0,0:WColour 0,0:Print SPACE$(80)
    WLocate 0,0:WColour 3,0:Print "Recognized a MIDI file..."
    Delay_ 50
    If Cvl(Inkey$(4))=#_MarkerLength
     WLocate 0,0:WColour 0,0:Print SPACE$(80)
     WLocate 0,0:WColour 3,0:Print "Header length correct..."
     Delay_ 50
     TipoDiFileMIDI.b=Cvi(Inkey$(2))
     WLocate 0,0:WColour 0,0:Print SPACE$(80):WLocate 0,0:WColour 3,0
     Select TipoDiFileMIDI
     Case #_FormatZero
      Print "Recognized Standard MIDI File Format 0..."
      Delay_ 50
     Case #_FormatOne
      Print "Recognized Standard MIDI File Format 1..."
      Delay_ 50
     Case #_FormatTwo
      Print "Recognized Standard MIDI File Format 2..."
      Delay_50
     Default
      IlFileCaricatoNonEUnFileMIDI.b=True
      Pop Select:Pop If:Pop If:Pop If:Pop If:Goto FineCicloCaricamento
     End Select

     If IlFileCaricatoNonEUnFileMIDI=False
      Tracce.w=Cvi(Inkey$(2))
      If Tracce>0
       WLocate 0,0:WColour 0,0:Print SPACE$(80)
       WLocate 0,0:WColour 3,0:Print "There "
       If Tracce=1 Then Print "is one track..." Else Print "are ",Tracce," tracks..."
       Delay_ 50

       If Tracce>1 AND TipoDiFileMIDI=#_FormatZero
        IlFileCaricatoNonEUnFileMIDI=True
        Pop If:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
        Goto FineCicloCaricamento
       EndIf

       TicPerQuarto.w=Cvi(Inkey$(2))
       If TicPerQuarto<0
        EZRequest "AmySequencer message","SMPTE timing not supported yet","OK"
        Pop If:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
        Goto FineCicloCaricamento
       EndIf

       TicPerSessantaquattresimo.b=TicPerQuarto/16
       WLocate 0,0:WColour 0,0:Print SPACE$(80)
       WLocate 0,0:WColour 3,0:Print "Ticks per quarter note: ",TicPerQuarto,"..."
       Delay_ 50
       WLocate 0,0:WColour 0,0:Print SPACE$(80)
       WLocate 0,0:WColour 3,0
       If Tracce=1 Then Print "One track loading..." Else Print Tracce," tracks loading..."
       Delay_ 50
       Traccia.w=0
       Repeat
        WLocate 0,0:WColour 0,0:Print SPACE$(80)
        WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
        Sequenza.l=Traccia+1
        LastItem Sequenza()

        If AddItem(Sequenza())=False
         EZRequest "AmySequencer message","You have used all the available sequences","OK"
         Pop If:Pop Repeat:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
         Goto FineCicloCaricamento
        EndIf

        ResetList Sequenza()
        SequenzaCorrente.l=0
        While NextItem(Sequenza())=True
         SequenzaCorrente+1
         If SequenzaCorrente=Sequenza Then Pop While:Goto FineRicercaSequenza
        Wend
FineRicercaSequenza
        LastItem SequenzaNellaTraccia()
        If AddItem(SequenzaNellaTraccia())=True
         SequenzaNellaTraccia()\Sequenza=Sequenza
        Else
         EZRequest "AmySequencer message","You have used all the available sequences","OK"
         Pop If:Pop Repeat:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
         Goto FineCicloCaricamento
        EndIf

        ResetList SequenzaNellaTraccia()
        SequenzaCorrenteNellaTraccia.l=0
        While NextItem(SequenzaNellaTraccia())=True
         If SequenzaNellaTraccia()\Sequenza=Sequenza
          SequenzaCorrenteNellaTraccia+1
          If SequenzaCorrenteNellaTraccia=1
           SequenzaNellaTraccia()\Genitore=True
          Else
           SequenzaNellaTraccia()\Genitore=Sequenza
          EndIf
         EndIf
        Wend

        If SequenzaNellaTraccia()\Genitore=True
         Sequenza()\Durata=(#TicDiBasePerQuarto*4.0*Battiti)/Misure
         MarcatoreTraccia$=Inkey$(4)
         If MarcatoreTraccia$=TrackMarker$
          If Panico{}=True
           WLocate 0,0:WColour 0,0:Print SPACE$(80)
           WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": found track marker..."
           Panico=True
          Else
           If Panico=True
            WLocate 0,0:WColour 0,0:Print SPACE$(80)
            WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
            Panico=False
           EndIf
          EndIf
          LunghezzaTraccia.l=Cvl(Inkey$(4))
          If LunghezzaTraccia>0
           ContatoreByteTraccia.l=0
           InizioEventoMusicale.l=0
           PosizioneEventoMusicale.l=0
           InizioTraccia.b=True
           Repeat

            Repeat
             DeltaPosizioneEventoMusicale.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
             NuovoDeltaPosizioneEventoMusicale.b=DeltaPosizioneEventoMusicale BitTst 7
             If Panico{}=True
              WLocate 0,0:WColour 0,0:Print SPACE$(80)
              WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
              If NuovoDeltaPosizioneEventoMusicale=True
               Print " another event position value to add search..."
              Else
               Print " this was the last event position value to add..."
              EndIf
              Panico=True
             Else
              If Panico=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
               Panico=False
              EndIf
             EndIf
             DeltaPosizioneEventoMusicale BitClr 7
             DeltaPosizioneEventoMusicale*TicPerSessantaquattresimo/#TicDiBasePerSessantaquattresimo
             PosizioneEventoMusicale+DeltaPosizioneEventoMusicale
             ContatoreByteTraccia+1
            Until NuovoDeltaPosizioneEventoMusicale=False

            If Panico{}=True
             WLocate 0,0:WColour 0,0:Print SPACE$(80)
             WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
             Print " status byte search..."
             Panico=True
            Else
             If Panico=True
              WLocate 0,0:WColour 0,0:Print SPACE$(80)
              WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
              Panico=False
             EndIf
            EndIf
            NuovoByteDiStato.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
            ContatoreByteTraccia+1
            If NuovoByteDiStato<>#_MetaEvent
             If NuovoByteDiStato<0 Then ByteDiStato.b=NuovoByteDiStato
             TipoDiEventoMusicale.b=ByteDiStato & #_StatusBits
             CanaleEventoMusicale.b=ByteDiStato & #_ChannelBits

             If InizioTraccia=True
              SequenzaNellaTraccia()\Inizio=PosizioneEventoMusicale
              PosizioneEventoMusicale=0
              InizioTraccia=False
             EndIf

             If Panico{}=True
              WLocate 0,0:WColour 0,0:Print SPACE$(80)
              WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
              Print " found event at "
              ConvertiIlTempoInBattute{PosizioneEventoMusicale,1}
              Print "..."
              Panico=True
             Else
              If Panico=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
               Panico=False
              EndIf
             EndIf
             CanaleEventoMusicale+1
             Select TipoDiEventoMusicale
             Case #_NoteOff
              TipoDiEventoMusicale$="NoteOff"
              If NuovoByteDiStato>-1
               EventoMusicale.b=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              ValoreEventoMusicale.b=Asc(Inkey$)
              ContatoreByteTraccia+1
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " note off value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_NoteOn
              TipoDiEventoMusicale$="Note"
              If NuovoByteDiStato>-1
               EventoMusicale=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              ValoreEventoMusicale=Asc(Inkey$)
              ContatoreByteTraccia+1
              If ValoreEventoMusicale=0
               TipoDiEventoMusicale$="NoteOff"
               If Panico{}=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
                Print " note off value found..."
                Panico=True
               Else
                If Panico=True
                 WLocate 0,0:WColour 0,0:Print SPACE$(80)
                 WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                 Panico=False
                EndIf
               EndIf
              Else
               If Panico{}=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
                Print " note on value found..."
                Panico=True
               Else
                If Panico=True
                 WLocate 0,0:WColour 0,0:Print SPACE$(80)
                 WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                 Panico=False
                EndIf
               EndIf
              EndIf
             Case #_ProgramChange
              TipoDiEventoMusicale$="Program"
              If NuovoByteDiStato>-1
               EventoMusicale=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " program change value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_ControlChange
              TipoDiEventoMusicale$="Control"
              If NuovoByteDiStato>-1
               EventoMusicale=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              ValoreEventoMusicale=Asc(Inkey$)
              ContatoreByteTraccia+1
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " control change value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_PolyphonicKeyPressure
              TipoDiEventoMusicale$="PolyAftertouch"
              If NuovoByteDiStato>-1
               EventoMusicale=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " polyphonic key pressure value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_ChannelKeyPressure
              TipoDiEventoMusicale$="MonoAftertouch"
              If NuovoByteDiStato>-1
               EventoMusicale=NuovoByteDiStato
              Else
               EventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " channel key pressure value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_PitchBend
              TipoDiEventoMusicale$="PitchBend"
              If NuovoByteDiStato>-1
               ValoreEventoMusicale=NuovoByteDiStato
              Else
               ValoreEventoMusicale=Asc(Inkey$)
               ContatoreByteTraccia+1
              EndIf
              EventoMusicale=Asc(Inkey$)
              ContatoreByteTraccia+1
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " pitchbend value found..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Default
              TipoDiEventoMusicale$=""
             End Select

             If TipoDiEventoMusicale$<>""
              If TipoDiEventoMusicale$<>"NoteOff"
               If AddItem(EventoMusicale())=True
                EventoMusicale()\Tipo=TipoDiEventoMusicale$
                EventoMusicale()\Evento=EventoMusicale
                EventoMusicale()\Inizio=PosizioneEventoMusicale
                EventoMusicale()\Canale=CanaleEventoMusicale
                EventoMusicale()\Sequenza=Sequenza
                EventoMusicale()\Durata=2
                If TipoDiEventoMusicale$="Note"
                 EventoMusicale()\Valore=ValoreEventoMusicale
                 EventoMusicale()\Stato | #EventoMusicaleEseguito
                EndIf
                If TipoDiEventoMusicale$="Control" Then EventoMusicale()\Valore=ValoreEventoMusicale
                If TipoDiEventoMusicale$="PitchBend" Then EventoMusicale()\Valore=ValoreEventoMusicale
                Sequenza()\EventiMusicali+1
               Else
                EZRequest "AmySequencer message","You have used all the available sequences","OK"
                Pop If:Pop If:Pop If:Pop If:Pop Repeat:Pop If
                Pop If:Pop If:Pop Repeat:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
                Goto FineCicloCaricamento
               EndIf
              Else
               PushItem EventoMusicale()
               ResetList EventoMusicale()
               While NextItem(EventoMusicale())=True
                If EventoMusicale()\Stato & #EventoMusicaleTerminato<>#EventoMusicaleTerminato
                 If EventoMusicale()\Stato & #EventoMusicaleEseguito=#EventoMusicaleEseguito
                  If EventoMusicale()\Tipo="Note"
                   If EventoMusicale()\Evento=EventoMusicale AND EventoMusicale()\Canale=CanaleEventoMusicale
                    EventoMusicale()\Durata=PosizioneEventoMusicale-EventoMusicale()\Inizio
                    EventoMusicale()\Stato & %11110111
                    EventoMusicale()\Stato | #EventoMusicaleTerminato
                    If Panico{}=True
                     WLocate 0,0:WColour 0,0:Print SPACE$(80)
                     WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia
                     Print ", note duration "
                     ConvertiIlTempoInBattute{EventoMusicale()\Durata,0}
                     Print "..."
                     Panico=True
                    Else
                     If Panico=True
                      WLocate 0,0:WColour 0,0:Print SPACE$(80)
                      WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                      Panico=False
                     EndIf
                    EndIf
                   EndIf
                   Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileCaricamento
                  EndIf
                 EndIf
                Else
                 EventoMusicale()\Stato & %11101111
                EndIf
               Wend
FineCicloWhileCaricamento
               PopItem EventoMusicale()
              EndIf
              Sequenza()\Durata=Max(Sequenza()\Durata,EventoMusicale()\Inizio+EventoMusicale()\Durata)
             EndIf
            Else
             TipoDiMetaEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
             ContatoreByteTraccia+1
             Select TipoDiMetaEvento
             Case #_SequenceNumber

;---------------------------------------------------------------------------
;questa variabile e' fittizia, il suo valore e' noto ed  e' 2, e' usata per
; saltare un dato
;this is a dummy var, its value is known and is 2, is used to skip a datum
;--------------------------------------------------------------------------
              LunghezzaMetaEvento.l=Asc(Inkey$)

              ContatoreByteTraccia+1
              Sequenza=Cvi(Inkey$(2))
              ContatoreByteTraccia+2
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " sequence number: ",Sequenza,"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
              PushItem Sequenza()
              ResetList Sequenza()
              SequenzaCorrente=0
              While NextItem(Sequenza())=True
               SequenzaCorrente+1
               If SequenzaCorrente=Sequenza Then Pop While:Goto FineCicloSequenza
              Wend
FineCicloSequenza
              PopItem Sequenza()
             Case #_SequenceName
              LunghezzaNome.l=0
              Repeat
               DeltaLunghezzaNome.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
               FineDeiDeltaLunghezzaNome.b=DeltaLunghezzaNome BitTst 7
               If Panico{}=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
                If FineDeiDeltaLunghezzaNome=True
                 Print " another sequence name length value to add search..."
                Else
                 Print " this was the last sequence name length value to add..."
                EndIf
                Panico=True
               Else
                If Panico=True
                 WLocate 0,0:WColour 0,0:Print SPACE$(80)
                 WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                 Panico=False
                EndIf
               EndIf
               DeltaLunghezzaNome BitClr 7
               LunghezzaNome+DeltaLunghezzaNome
               ContatoreByteTraccia+1
              Until FineDeiDeltaLunghezzaNome=False
              NomeSequenza$=StripTrail$(Inkey$(LunghezzaNome),0)
              ContatoreByteTraccia+LunghezzaNome
              Sequenza()\Nome=NomeSequenza$
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               Print " sequence name: ",Left$(NomeSequenza$,77-WCursX/8),"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
             Case #_TimeSignatureChange
              LunghezzaDatiDelTempo.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
              ContatoreByteTraccia+1
              Battiti=Asc(Inkey$)
              ContatoreByteTraccia+1
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               If Battiti=1 Then Battiti$="beat" Else Battiti$="beats"
               Print Spazio$,Battiti,Spazio$,Battiti$,"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
              Misure=2^Asc(Inkey$)
              ContatoreByteTraccia+1
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               If Misure=1 Then Misure$="measure" Else Misure$="measures"
               Print Spazio$,Misure,Spazio$,Misure$,"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
              TicPerBattito=Asc(Inkey$)
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
               If TicPerBattito=1 Then TicPerBattito$="tic per beat" Else TicPerBattito$="tics per beat"
               Print Spazio$,TicPerBattito,Spazio$,TicPerBattito$,"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
              ContatoreByteTraccia+1
              TrentaduesimiInUnQuarto.b=Asc(Inkey$)
              If Panico{}=True
               WLocate 0,0:WColour 0,0:Print SPACE$(80)
               WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
          If TicPerBattito=1 Then TrentaduesimiInUnQuarto$="32th per quarter" Else  TrentaduesimiInUnQuarto$="32ths per quarter"
               Print Spazio$,TrentaduesimiInUnQuarto,Spazio$,TrentaduesimiInUnQuarto$,"..."
               Panico=True
              Else
               If Panico=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                Panico=False
               EndIf
              EndIf
              ContatoreByteTraccia+1
             Default
              LunghezzaMetaEvento=0
              Repeat
               DeltaLunghezzaMetaEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
               FineDeiDeltaLunghezzaMetaEvento.b=DeltaLunghezzaMetaEvento BitTst 7
               If Panico{}=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
                If FineDeiDeltaLunghezzaMetaEvento=True
                 Print " another meta event length value to add search..."
                Else
                 Print " this was the last meta event length value to add..."
                EndIf
                Panico=True
               Else
                If Panico=True
                 WLocate 0,0:WColour 0,0:Print SPACE$(80)
                 WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                 Panico=False
                EndIf
               EndIf
               DeltaLunghezzaMetaEvento BitClr 7
               LunghezzaMetaEvento+DeltaLunghezzaMetaEvento
               ContatoreByteTraccia+1
              Until FineDeiDeltaLunghezzaMetaEvento=False
              If LunghezzaMetaEvento>0
               ValoreMetaEvento$=Inkey$(LunghezzaMetaEvento)
               ContatoreByteTraccia+LunghezzaMetaEvento
               If Panico{}=True
                WLocate 0,0:WColour 0,0:Print SPACE$(80)
                WLocate 0,0:WColour 3,0:Print Left$(ValoreMetaEvento$,80)
                Panico=True
               Else
                If Panico=True
                 WLocate 0,0:WColour 0,0:Print SPACE$(80)
                 WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
                 Panico=False
                EndIf
               EndIf
              EndIf
             End Select
            EndIf
           Until NuovoByteDiStato=#_MetaEvent AND TipoDiMetaEvento=#_EndOfTrackChunk
           If Panico{}=True
            WLocate 0,0:WColour 0,0:Print SPACE$(80)
            WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": ",ContatoreByteTraccia," of ",LunghezzaTraccia,"..."
            Panico=True
           Else
            If Panico=True
             WLocate 0,0:WColour 0,0:Print SPACE$(80)
             WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": loading..."
             Panico=False
            EndIf
           EndIf
           If Panico{}=True
            WLocate 0,0:WColour 0,0:Print SPACE$(80)
            WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": "
            If ContatoreByteTraccia=LunghezzaTraccia
             Print "bytes match! :-)"
            Else
             Print "bytes don't match! :-("
            EndIf
            Panico=True
           Else
            If Panico=True
             WLocate 0,0:WColour 0,0:Print SPACE$(80)
             WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": end loading."
             Panico=False
            EndIf
           EndIf
          Else
           WLocate 0,0:WColour 3,0:Print "No datum found..."
          EndIf
         Else
          IlFileCaricatoNonEUnFileMIDI=True
          Pop If:Pop If:Pop Repeat:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If
          Goto FineCicloCaricamento
         EndIf
         SequenzaNellaTraccia()\Traccia=Traccia+1
         SequenzaEsistente(Sequenza-1)=True
         Traccia(Traccia)=True
         SequenzaMassimaDaCreare+1
        EndIf
        Traccia+1
       Until Traccia=Tracce
      EndIf
     Else
      IlFileCaricatoNonEUnFileMIDI=True
      Pop If:Pop If:Pop If:Pop If:Pop If:Goto FineCicloCaricamento
     EndIf
    EndIf
   EndIf
  EndIf

FineCicloCaricamento
  CloseFile #FileMIDIDaCaricare
  PopInput
  WJam #UnColoreConSfondoTrasparente

  If IlFileCaricatoNonEUnFileMIDI=True
   EZRequest "AmySequencer message","This is not a MIDI file","OK"
  Else
   If CaricatoDalMenu=False
    For FileMIDIAperto.b=3 To 0 Step -1
     FileMIDIAperto$(FileMIDIAperto+1)=FileMIDIAperto$(FileMIDIAperto)
    Next FileMIDIAperto
    FileMIDIAperto$(0)=NomeDelFileMIDI$
    StoriaDeiFileMIDIAperti.b=WriteFile(#StoriaDeiFileMIDI,"LoadedMIDIFilesHistory")
    If StoriaDeiFileMIDIAperti=True
     FileOutput #StoriaDeiFileMIDI
     For FileMIDIAperto=0 To 4
      If FileMIDIAperto$(FileMIDIAperto)<>""
       NPrint FileMIDIAperto$(FileMIDIAperto)
     EndIf
     Next FileMIDIAperto
     CloseFile #StoriaDeiFileMIDI
     PopOutput
    EndIf
   EndIf
  EndIf
 EndIf
End Statement

;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with the program
;---------------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED CanaliAttivati
SHARED LarghezzaSchermo
SHARED PercorsoSuoni$
SHARED Suono()
SHARED TastoFuga$
SHARED XLunSlider
SHARED YLunSlider

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
 MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
 MenuItem #ListaMenuEditoreSuoni,0,0,1,"Delete"

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#BottoneChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
 LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
 AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
 CloseWindow #FinestraEditoreSuoni

;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;----------------------------------------------------------
 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSuoni
 ImpostaSlider{#SliderEditoreSuoni,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}

 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSuoni

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

;-----------------------------------
;sounds window's displacement start
;-----------------------------------
 InizioSuoni.b=0

;------------------------
;maximum strings length
;------------------------
 LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8

;---------------------------------
;stated by mouse new sound number
;---------------------------------
 NuovoSuonoIndicatoDalTopo.b=-1

;-----------------------------
;stated by mouse sound number
;-----------------------------
 SuonoIndicatoDalTopo.b=-1

;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{#SliderEditoreSuoni,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}

 Repeat
  If SecondoClicDelTopo.b=False

   WCls

   WLocate 0,0

;----------------------
;loaded sounds counter
;----------------------
   SuoniCaricati=0

   For Suono.b=0 To 30
    AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
    If AssegnamentoSuono$<>""
     CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
     If CanaleSuono>0
      WColour CanaleSuono-1,16-CanaleSuono:Format "00":CanaleSuono$=" channel "+Str$(CanaleSuono):Format""
     Else
      WColour 1,0:CanaleSuono$=" no channel"
     EndIf
     AssegnamentoSuono$+CanaleSuono$
     AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
     AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
     NPrint AssegnamentoSuono$
     If SuonoIndicatoDalTopo>-1 AND SuonoIndicatoDalTopo=InizioSuoni+Suono
      If CanaleSuono>0
       Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,CanaleSuono-1
       Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,CanaleSuono-1
      Else
       Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,1
       Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,1
      EndIf
     EndIf
     SuoniCaricati+1
    EndIf
   Next Suono
   SecondoClicDelTopo=True
  EndIf

  If SuoniCaricati=32
   Enable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
  Else
   Disable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
  EndIf
  Redraw #FinestraEditoreSuoni

  EventoFinestraEditoreSuoni.l=WaitEvent

  Select EventoFinestraEditoreSuoni
  Case #HaiPremutoUnTastoDelTopo
   TastoDelTopoCliccato.b=MButtons:YTopo=WMouseY
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    NuovoSuonoIndicatoDalTopo=YTopo/8+InizioSuoni
    If NuovoSuonoIndicatoDalTopo=SuonoIndicatoDalTopo
     If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
      CanaleSuonoIndicatoDalTopo.b=Suono(SuonoIndicatoDalTopo)\Canale
      If CanaliAttivati=%1111111111111111
       Suono(SuonoIndicatoDalTopo)\Canale=0
       CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
      Else
       If CanaleSuonoIndicatoDalTopo>0
        If CanaleSuonoIndicatoDalTopo=16
         Suono(SuonoIndicatoDalTopo)\Canale=0
         CanaliAttivati BitClr 15
         CanaleSuono=0
        Else
         For CanaleSuono=1 To 15
          CanaleLibero.b=(CanaleSuono+CanaleSuonoIndicatoDalTopo-1) MOD 16
          If CanaliAttivati BitTst CanaleLibero=False
           Suono(SuonoIndicatoDalTopo)\Canale=CanaleLibero+1
           CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
           CanaliAttivati BitSet CanaleLibero
           Pop If:Pop For:Pop If:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
          EndIf
         Next CanaleSuono
        EndIf
       Else
        For CanaleSuono=0 To 15
         If CanaliAttivati BitTst CanaleSuono=False
          Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono+1
          CanaliAttivati BitSet CanaleSuono
          Pop If:Pop For:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
         EndIf
        Next CanaleSuono
       EndIf
      EndIf
FineCicloAssegnamentoCanali
      If CanaleSuono=16 Then EZRequest "AmySequencer Message","No free channel available","OK"
     EndIf
    Else
     SuonoIndicatoDalTopo=NuovoSuonoIndicatoDalTopo
    EndIf
    SecondoClicDelTopo=False
   Case #TastoSinistroDelTopoRilasciato
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnBottone
;   InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
;   SecondoClicDelTopo=False
  Case #HaiRilasciatoUnBottone
   InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   If MenuHit=0 AND ItemHit=0
    If SuoniCaricati<32
     MaxLen PercorsoSuoni$=160
     MaxLen NomeSuono$=64
     NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
     If NomeSuono$<>""
      StessoSuono.b=False
      If SuoniCaricati>0
       For SuonoPrecedente=0 To SuoniCaricati-1
        If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
       Next SuonoPrecedente
      EndIf
      If StessoSuono=False
       Suono=SuoniCaricati
       LoadSound Suono,NomeSuono$
       Suono(Suono)\Nome=NomeSuono$
       Sound Suono,3
      EndIf
     EndIf
    Else
     EZRequest "AmySequencer message","You cannot load more sounds","OK"
    EndIf
   EndIf
   If MenuHit=0 AND ItemHit=1
    If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
     Suono=SuonoIndicatoDalTopo
     Free Sound Suono
     Suono(Suono)\Nome=""
     While Suono+1<SuoniCaricati
      Suono(Suono)\Nome=Suono(Suono+1)\Nome
      Suono(Suono)\Canale=Suono(Suono+1)\Canale
      Suono+1
     Wend
     Suono(Suono)\Nome=""
     CanaliAttivati BitClr (Suono(Suono)\Canale-1)
     Suono(Suono)\Canale=0
     SuonoIndicatoDalTopo=-1
    Else
     EZRequest "AmySequencer message","You must load a sound first","OK"
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDallEditoreSuoni.b=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoFuga$
    EsciDallEditoreSuoni=True
   End Select
   SecondoClicDelTopo=True
  End Select
  FlushEvents
 Until EsciDallEditoreSuoni=True
 CloseWindow #FinestraEditoreSuoni
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEventoMusicale$,Evento.w,InizioEvento.l,DurataEvento.l,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
 EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
 EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
 Select TipoDiEventoMusicale$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
   I.w=16+(InizioNota-XInizioAreaVisibile)/ScalaEventiMusicali
   F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    If TipoDiNota(Nota)\Diesis=True
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
    Else
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineProgramma-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Programma.b=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   For Linea.b=0 To 7
    Y.w=Programma+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineProgramma,Y,0
    Else
     Wline I,Y,FineProgramma,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineControllo-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Controllo.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   For Linea.b=0 To 7
    Y=Controllo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineControllo,Y,0
    Else
     Wline I,Y,FineControllo,Y,3
    EndIf
   Next Linea
  EndIf
 Case "PolyAftertouch"
  FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FinePressioneMultipla-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   PressioneMultipla.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   For Linea.b=0 To 7
    Y=PressioneMultipla+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FinePressioneMultipla,Y,0
    Else
     Wline I,Y,FinePressioneMultipla,Y,3
    EndIf
   Next Linea
  EndIf
 Case "MonoAftertouch"
  FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FinePressioneSingola-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   PressioneSingola.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   For Linea.b=0 To 7
    Y=PressioneSingola+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FinePressioneSingola,Y,0
    Else
     Wline I,Y,FinePressioneSingola,Y,3
    EndIf
   Next Linea
  EndIf
 Case "PitchBend"
  FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineCurvaDiPicco-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   CurvaDiPicco.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento/128)/127
   For Linea.b=0 To 7
    Y=CurvaDiPicco+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineCurvaDiPicco,Y,0
    Else
     Wline I,Y,FineCurvaDiPicco,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo00/000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineTempo-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Tempo.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   For Linea.b=0 To 7
    Y=Tempo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineTempo,Y,0
    Else
     Wline I,Y,FineTempo,Y,3
    EndIf
   Next Linea
  EndIf
 Case "BPM"
  FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineBattutePerMinuto-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   BattutePerMinuto.w=(AreaVisibileDeiValori-1)*1.0*(97-(Evento-9)/3)/97
   For Linea.b=0 To 7
    Y=BattutePerMinuto+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineBattutePerMinuto,Y,0
    Else
     Wline I,Y,FineBattutePerMinuto,Y,3
    EndIf
   Next Linea
  EndIf
 End Select
End Statement

;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento.w,InizioEvento.l,DurataEvento.l,CanaleEvento.b,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
 EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
 EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
 EventoMusicaleEseguito.b=StatoEvento & #EventoMusicaleEseguito
 Select TipoDiEventoMusicale$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   FineNota.l=InizioEvento+DurataEvento-1
   I.w=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
   F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
    If EventoMusicaleEseguito=0

     If EventoMusicaleTagliato=#EventoMusicaleTagliato
      WLocate X0Nota,Y0Nota:WColour CanaleEvento-1,16-CanaleEvento:Print Left$("Cutted",(X1Nota-X0Nota+1)/8)
     EndIf
     If EventoMusicaleCopiato=#EventoMusicaleCopiato
      WLocate X0Nota,Y0Nota:WColour CanaleEvento-1,16-CanaleEvento:Print Left$("Copied",(X1Nota-X0Nota+1)/8)
     EndIf

     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
      Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
      Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
      Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
      If InizioNotaVisibile=True
       Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
      EndIf
      If FineNotaVisibile=True
       Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
      EndIf
     EndIf
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineProgramma-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":Programma$="Program"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Programma$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Programma$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Programma$+"Co"
   If I<0 Then IniziaPrima.b=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo.b=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y.w=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   If IniziaPrima=True Then Programma$=Right$(Programma$,(F-I+1)/8)
   If FinisceDopo=True Then Programma$=Left$(Programma$,(F-I+1)/8)
   WLocate 16+I,Y:Print Programma$
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineControllo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":Controllo$="Control"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Controllo$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Controllo$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Controllo$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   If IniziaPrima=True Then Controllo$=Right$(Controllo$,(F-I+1)/8)
   If FinisceDopo=True Then Controllo$=Left$(Controllo$,(F-I+1)/8)
   WLocate 16+I,Y:Print Controllo$
  EndIf
 Case "PolyAftertouch"
  FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FinePressioneMultipla-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":PressioneMultipla$="Poly"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneMultipla$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneMultipla$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then PressioneMultipla$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   If IniziaPrima=True Then PressioneMultipla$=Right$(PressioneMultipla$,(F-I+1)/8)
   If FinisceDopo=True Then PressioneMultipla$=Left$(PressioneMultipla$,(F-I+1)/8)
   WLocate 16+I,Y:Print PressioneMultipla$
  EndIf
 Case "MonoAftertouch"
  FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FinePressioneSingola-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":PressioneSingola$="Mono"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneSingola$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneSingola$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print PressioneSingola$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   If IniziaPrima=True Then PressioneSingola$=Right$(PressioneSingola$,(F-I+1)/8)
   If FinisceDopo=True Then PressioneSingola$=Left$(PressioneSingola$,(F-I+1)/8)
   WLocate 16+I,Y:Print PressioneSingola$
  EndIf
 Case "PitchBend"
  FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineCurvaDiPicco-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "+0000":CurvaDiPicco$="Bend"+Str$(Evento-#_PitchBendCenter):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then CurvaDiPicco$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then CurvaDiPicco$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then CurvaDiPicco$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(127-Evento/128)/127
   If IniziaPrima=True Then CurvaDiPicco$=Right$(CurvaDiPicco$,(F-I+1)/8)
   If FinisceDopo=True Then CurvaDiPicco$=Left$(CurvaDiPicco$,(F-I+1)/8)
   WLocate 16+I,Y:Print CurvaDiPicco$
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo00/000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineTempo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "00":Tempo$="Tempo"+Str$(Evento MOD 16+1)
   Format "000":Tempo$+"/"+Str$(2^(Evento/16))
   Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Tempo$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Tempo$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Tempo$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(127-Evento)/127
   If IniziaPrima=True Then Tempo$=Right$(Tempo$,(F-I+1)/8)
   If FinisceDopo=True Then Tempo$=Left$(Tempo$,(F-I+1)/8)
   WLocate 16+I,Y:Print Tempo$
  EndIf
 Case "BPM"
  FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineBattutePerMinuto-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":BattutePerMinuto$="BPM"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then BattutePerMinuto$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then BattutePerMinuto$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then BattutePerMinuto$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=(AreaVisibileDeiValori-1)*1.0*(97-(Evento-9)/3)/97
   If IniziaPrima=True Then BattutePerMinuto$=Right$(BattutePerMinuto$,(F-I+1)/8)
   If FinisceDopo=True Then BattutePerMinuto$=Left$(BattutePerMinuto$,(F-I+1)/8)
   WLocate 16+I,Y:Print BattutePerMinuto$
  EndIf
 End Select
End Statement

;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDegliEventiMusicali{Ritardo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ColoriOriginali
SHARED ScalaEventiMusicali
; For Scatola.b=0 To 4
;  Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
;  WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
 Select ScalaEventiMusicali
 Case 1
  Ingrandimento.b=1
 Case 2
  Ingrandimento=2
 Case 4
  Ingrandimento=3
 Case 8
  Ingrandimento=4
 Case 16
  Ingrandimento=5
 Case 32
  Ingrandimento=6
 Case 64
  Ingrandimento=7
 End Select
 WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8:WColour 2,1
 Print "Z",Ingrandimento
 If Ritardo=True Then Delay_ 50
 WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
 Print "+-"
End Statement

Statement MostraITastiDaUsare{}
 MostraITastiDaUsare$="Esc>.........leave the editor|"
 MostraITastiDaUsare$+"Space>.......insert a rest|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"No selected event:|"
 MostraITastiDaUsare$+"Cursor up>...scroll window up|"
 MostraITastiDaUsare$+"Cursor down>.scroll window down|"
 MostraITastiDaUsare$+"Cursor left>.scroll window backward|"
 MostraITastiDaUsare$+"Cursor right>scroll window forward|"
 MostraITastiDaUsare$+"Backspace>...delete last event|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"No selected event plus shift:|"
 MostraITastiDaUsare$+"Cursor left>.move insertion point backward|"
 MostraITastiDaUsare$+"Cursor right>move insertion point forward|"
 MostraITastiDaUsare$+"Backspace>...delete last event"
 EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"

 MostraITastiDaUsare$="With selected events:|"
 MostraITastiDaUsare$+"Cursor up>...inc sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor down>.dec sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor left>.move sel events forward|"
 MostraITastiDaUsare$+"Cursor right>move sel events backward|"
 MostraITastiDaUsare$+"Backspace>...delete last event|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"With selected events plus shift:|"
 MostraITastiDaUsare$+"Cursor up>...move sel notes up of one octave|"
 MostraITastiDaUsare$+"             inc sel events of 8|"
 MostraITastiDaUsare$+"             inc sel BPM events of 10|"
 MostraITastiDaUsare$+"             inc sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor down>.move sel notes down of one octave|"
 MostraITastiDaUsare$+"             dec sel events of 8|"
 MostraITastiDaUsare$+"             dec sel BMP events of 10|"
 MostraITastiDaUsare$+"             dec sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor left>.stretch sel notes backward|"
 MostraITastiDaUsare$+"Cursor right>stretch sel notes forward|"
 MostraITastiDaUsare$+"Backspace>...delete all sel events"
 EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"

End Statement

Statement MostraLaMappaturaDelleNoteSullaTastiera{}
 MostraLaMappaturaDelleNoteSullaTastiera$="Note    lo octave hi octave|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C--Do  >........Z.........Q|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C#-Do# >........S.........2|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D--Re  >........X.........W|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D#-Re# >........D.........3|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"E--Mi  >........C.........E|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F--Fa  >........V.........R|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F#-Fa# >........G.........5|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G--Sol >........B.........T|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G#-Sol#>........H.........6|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A--La  >........N.........Y|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A#-La# >........J.........7|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"B--Si  >........M.........U|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"function keys to select octave"
 EZRequest "AmySequencer help",MostraLaMappaturaDelleNoteSullaTastiera$,"OK"
End Statement

Statement ProgressioneEventiMusicaliCurvaDiPicco{InizioProgressione.w,FineProgressione.w}
SHARED CanaleSelezionato
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
 If CanaleSelezionato>0
  Valori.b=EZRequest("AmySequencer message","How many inner values|for the progression?","1|2|4|8|16|32|64|Cancel")
  If Valori=0 Then Statement Return
  Valori=2+2^(Valori-1)
  Passo.w=(FineProgressione-InizioProgressione)/(Valori-1)
  LastItem EventoMusicale()
  For Valore.w=InizioProgressione To FineProgressione Step Passo
   If AddItem(EventoMusicale())=True
    EventoMusicale()\Tipo="PitchBend"
    EventoMusicale()\Evento=Valore/128
    EventoMusicale()\Valore=Valore MOD 128
    EventoMusicale()\Inizio=XInizioAreaVisibile+LarghezzaEventoBase/(Valori-1)*Abs(Valore-InizioProgressione)/Passo
    EventoMusicale()\Durata=2
    EventoMusicale()\Canale=CanaleSelezionato
    EventoMusicale()\Sequenza=SequenzaSelezionata
    EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
    EventiMusicali+1
    EventiMusicaliSelezionati+1
   Else
    EZRequest "AmySequencer message","You have used all the available events","OK"
    ProgressioneInterrotta.b=True
    Pop For:Goto FineCicloForProgressione
   EndIf
  Next Valore
FineCicloForProgressione
  If ProgressioneInterrotta=False Then EZRequest "AmySequencer message","Progression successfully completed!","OK"
 Else
  EZRequest "AmySequencer message","You must select a channel first","OK"
 EndIf
End Statement

;-----------------------------------------------------------------------
;questa procedura permette di cambiare i parametri dell'evento corrente
;this procedure permits to change the current event parameters
;--------------------------------------------------------------
Statement CambiaLEventoBase{}
SHARED AltezzaFonte
SHARED ColoriOriginali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED ParlatoAttivato
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoFuga$
SHARED TipoDiEventoMusicaleDiBase$
SHARED ValoreEventoBase
SHARED XLunSlider
SHARED YLunSlider
 TipoFinestra.l=#FinestraMovibile+#BottoneNascondiFinestra+#BottoneChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 YPosF.w=(AltezzaFonte+3)*2
 YLunF.w=AltezzaFonte+3+16+8+8+2
 If TipoDiEventoMusicaleDiBase$<>"Program"
  If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
   If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
    YLunF+8+8
   EndIf
  EndIf
 EndIf
 If TipoDiEventoMusicaleDiBase$="PitchBend" Then YLunF+8+8
 TitoloFinestra$="Basic event: "+LCase$(TipoDiEventoMusicaleDiBase$)
 Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
 LarghezzaInternaFinestraCambioEventoBase.w=InnerWidth
 AltezzaInternaFinestraCambioEventoBase.w=InnerHeight
 CloseWindow #FinestraCambioEventoBase
 XLunSlider=LarghezzaInternaFinestraCambioEventoBase
 YLunSlider=8
 If TipoDiEventoMusicaleDiBase$<>"Program"
  If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
   If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
    If TipoDiEventoMusicaleDiBase$="PitchBend"
     ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
     ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
     ImpostaSlider{3,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
    Else
     ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
     ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
    EndIf
   Else
    ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
   EndIf
  EndIf
 Else
  ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
 EndIf
 Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetCambioEventoBase
 WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioEventoBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioEventoBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
 For Zona.b=0 To 6
  WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
 Next
 WBlit 7,24*7+9,0;:SetZone 7,24*7,0,24*8+23,15
 WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
 WLocate 24*9+8,4:WColour 1,0:Print "5";:SetZone 9,24*9,0,24*9+23,15
 MostraSlider{1,(LarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
 If TipoDiEventoMusicaleDiBase$<>"Program"
  If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
   If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
    If TipoDiEventoMusicaleDiBase$="PitchBend"
;------------------------------------------------------------------------------
;questa variabile contiene il valore finale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend final value
;-------------------------------------------------------
     FineCurvaDiPiccoEventoBase.w=#_PitchBendCenter

;--------------------------------------------------------------------------------
;questa variabile contiene il valore iniziale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend initial value
;---------------------------------------------------------
     InizioCurvaDiPiccoEventoBase.w=#_PitchBendCenter

     ValoreMassimo.w=16384
     Valore.w=InizioCurvaDiPiccoEventoBase
     MostraSlider{2,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     Valore.w=FineCurvaDiPiccoEventoBase
     MostraSlider{3,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
    Else
     MostraSlider{2,ValoreEventoBase,127,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
    EndIf
   EndIf
  EndIf
 EndIf
 NuovaLarghezzaEventoBase.w=LarghezzaEventoBase
 NuovoValoreEventoBase.w=ValoreEventoBase
 NuovoInizioCurvaDiPiccoEventoBase.w=InizioCurvaDiPiccoEventoBase
 NuovaFineCurvaDiPiccoEventoBase.w=FineCurvaDiPiccoEventoBase
 EventoBaseModificato.b=False
 Repeat
  If SecondoClicDelTopo.b=False
   If TipoDiEventoMusicaleDiBase$<>"Program"
    If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
     If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
      If TipoDiEventoMusicaleDiBase$="PitchBend"
       WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8-8
      Else
       WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8
      EndIf
     Else
      WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
     EndIf
    EndIf
   Else
    WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
   EndIf
   If NuovaLarghezzaEventoBase MOD 6=0
    If ColoriOriginali=True Then WColour 3,2 Else WColour 10,9
   Else
    WColour 2,1
   EndIf
   Format "0000":Print NuovaLarghezzaEventoBase:Format "":Print SPACE$(21)+"width"
   If TipoDiEventoMusicaleDiBase$<>"Program"
    If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
     If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
      If TipoDiEventoMusicaleDiBase$="PitchBend"
       Y.w=AltezzaInternaFinestraCambioEventoBase-8-8-8-8
       WLocate 0,Y:WColour 1,0:Format "+0000"
       Print NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
       Valore$="initial"
      Else
       Y=AltezzaInternaFinestraCambioEventoBase-8-8
       WLocate 0,Y:WColour 1,0:Format "000":Print NuovoValoreEventoBase:Format ""
       If TipoDiEventoMusicaleDiBase$="Note" Then Valore$="velocity"
       If TipoDiEventoMusicaleDiBase$="Control" Then Valore$="value"
      EndIf
      WLocate (30-Len(Valore$))*8,Y:Print Valore$
     EndIf
    EndIf
   EndIf
   If TipoDiEventoMusicaleDiBase$="PitchBend"
    Y=AltezzaInternaFinestraCambioEventoBase-8-8
    WLocate 0,Y:WColour 1,0:Format "+0000"
    Print NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
    Valore$="final":WLocate (30-Len(Valore$))*8,Y:Print Valore$
   EndIf
   SecondoClicDelTopo=True
  EndIf
  Repeat
   If ParlatoAttivato=True AND Parlato$<>"" AND Timer-TempoTrascorso.l>49 Then Speak Parlato$:Parlato$=""

   EventoFinestraCambioEventoBase.l=Event

  Until EventoFinestraCambioEventoBase>0

  Select EventoFinestraCambioEventoBase
  Case #HaiPremutoUnTastoDelTopo
   XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato.b=MButtons
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    XZonaTopo.b=XTopo/24+1:YZonaTopo.b=YTopo>=0 AND YTopo<16
    If YZonaTopo=True
     Select XZonaTopo
     Case 1
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto*4:NotaPuntata.w=0:Terzina.b=0:Cinquina.b=0
      Parlato$="You have choosen a whole note width"
     Case 2
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto*2:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a half note width"
     Case 3
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a quarter note width"
     Case 4
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/2:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen an eighth note width"
     Case 5
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/4:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a sixteenth note width"
     Case 6
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/8:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a thirty second note width"
     Case 7
      NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/16:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a sixty fourth note width"
     Case 8
      If NotaPuntata=0
       If Terzina>0
        NuovaLarghezzaEventoBase*Terzina
        Parlato$="You have no more a triplet note width,"
        Terzina=0
       EndIf
       If Cinquina>0
        NuovaLarghezzaEventoBase*Cinquina
        Parlato$="You have no more a quintet note width,"
        Cinquina=0
       EndIf
       NotaPuntata=NuovaLarghezzaEventoBase/2
       If NuovaLarghezzaEventoBase+NotaPuntata<=192*6
        NuovaLarghezzaEventoBase+NotaPuntata
        Parlato$+" you have choosen a dotted note width."
       Else
        NotaPuntata=0:XZonaTopo=0
       EndIf
      Else
       NuovaLarghezzaEventoBase/3*2
       NotaPuntata=0
       Parlato$="You have no more a dotted note width"
      EndIf
     Case 9
      If Terzina=0 AND NuovaLarghezzaEventoBase>5
       If NotaPuntata>0
        NuovaLarghezzaEventoBase/3*2
        Parlato$="You have no more a dotted note width,"
        NotaPuntata=0
       EndIf
       If Cinquina>0
        NuovaLarghezzaEventoBase*Cinquina
        Parlato$="You have no more a quintet note width,"
        Cinquina=0
       EndIf
       Terzina=3:NuovaLarghezzaEventoBase/Terzina
       Parlato$+" you have choosen a triplet note width."
      Else
       NuovaLarghezzaEventoBase*Terzina
       Parlato$="You have no more a triplet note width."
       Terzina=0
      EndIf
     Case 10
      If Cinquina=0 AND NuovaLarghezzaEventoBase>9
       If NotaPuntata>0
        NuovaLarghezzaEventoBase/3*2
        Parlato$="You have no more a dotted note width,"
        NotaPuntata=0
       EndIf
       If Terzina>0
        NuovaLarghezzaEventoBase*Terzina
        Parlato$="You have no more a triplet note width,"
        Terzina=0
       EndIf
       Cinquina=5:NuovaLarghezzaEventoBase/Cinquina
       Parlato$+" you have choosen a quintet note width."
      Else
       NuovaLarghezzaEventoBase*Cinquina
       Parlato$="You have no more a quintet note width."
       Cinquina=0
      EndIf
     End Select
     If XZonaTopo>0 AND XZonaTopo<11
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
      Parlato$+", that are "+Str$(NuovaLarghezzaEventoBase)+" ticks."
     EndIf
    EndIf
    SecondoClicDelTopo=False
    TempoTrascorso=Timer
   Case #TastoSinistroDelTopoRilasciato
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnBottone
;   XLunSlider=LarghezzaInternaFinestraCambioEventoBase
;   Select GadgetHit
;   Case 1
;    NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
;    NotaPuntata=0:Terzina=0
;    Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
;   Case 2
;    If TipoDiEventoMusicaleDiBase$="PitchBend"
;     NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    Else
;     NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    EndIf
;    If TipoDiEventoMusicaleDiBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
;    If TipoDiEventoMusicaleDiBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
;    If TipoDiEventoMusicaleDiBase$="PitchBend"
;    Parlato$="You have choosen a bend inital value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_pitchBendCenter)+"."
;    EndIf
;   Case 3
;    NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
;   End Select
;   SecondoClicDelTopo=False
;   TempoTrascorso=Timer
  Case #HaiRilasciatoUnBottone
   XLunSlider=LarghezzaInternaFinestraCambioEventoBase
   Select GadgetHit
   Case 1
    NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
    NotaPuntata=0:Terzina=0:Cinquina=0
    Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
   Case 2
    If TipoDiEventoMusicaleDiBase$="PitchBend"
     NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    Else
     NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    EndIf
    If TipoDiEventoMusicaleDiBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
    If TipoDiEventoMusicaleDiBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
    If TipoDiEventoMusicaleDiBase$="PitchBend"
     Parlato$="You have choosen a bend initial value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
    EndIf
   Case 3
    NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
   End Select
   TempoTrascorso=Timer
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDalCambioEventoBase=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoFuga$
    EsciDalCambioEventoBase=True
   Case TastoCursoreDestra$
    If NuovaLarghezzaEventoBase<#TicDiBasePerQuarto*6-2
     NuovaLarghezzaEventoBase+2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
    EndIf
   Case TastoCursoreSinistra$
    If NuovaLarghezzaEventoBase>3
     NuovaLarghezzaEventoBase-2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
    EndIf
   End Select
   TempoTrascorso=Timer
   SecondoClicDelTopo=False
  End Select
  FlushEvents
 Until EsciDalCambioEventoBase=True
 If NuovaLarghezzaEventoBase<>LarghezzaEventoBase Then EventoBaseModificato=True
 If NuovoValoreEventoBase<>ValoreEventoBase Then EventoBaseModificato=True
 LarghezzaEventoBase=NuovaLarghezzaEventoBase
 ValoreEventoBase=NuovoValoreEventoBase
 If EventiMusicaliSelezionati>0
  If EventoBaseModificato=True
   Messaggio$="You have made changes:"
  Else
   Messaggio$="You have made no changes:"
  EndIf
  Messaggio$+"|Would you apply the current|settings to the selected events?"
  ApplicaINuoviValoriAgliEventiMusicaliSelezionati.b=EZRequest("AmySequencer message",Messaggio$,"Yes|No")
  If ApplicaINuoviValoriAgliEventiMusicaliSelezionati=1
   Select TipoDiEventoMusicaleDiBase$
   Case "Note"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize notes start?","Yes|No")
    AggiustaDurata.b=EZRequest("AmySequencer message","Quantize notes length?","Yes|No")
    AggiustaValore.b=EZRequest("AmySequencer message","Change notes velocity?","Yes|No")
   Case "Program"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "Control"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize controls start?","Yes|No")
    AggiustaValore=EZRequest("AmySequencer message","Change controls value?","Yes|No")
   Case "PolyAftertouch"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "MonoAftertouch"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "PitchBend"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize pitch bends start?","Yes|No")
   Case "Tempo"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize tempo events start?","Yes|No")
   Case "BPM"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize BPM events start?","Yes|No")
   End Select
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    StatoEventoMusicale.b=EventoMusicale()\Stato
    SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato
     Select EventoMusicale()\Tipo
     Case "Note"
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
      If AggiustaDurata=1 Then EventoMusicale()\Durata/LarghezzaEventoBase*LarghezzaEventoBase
     Case "Program"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "PolyAftertouch"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "MonoAftertouch"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "Control"
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "PitchBend"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "Tempo"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "BPM"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     End Select
    EndIf
   Wend
  EndIf
 EndIf
 If NuovoInizioCurvaDiPiccoEventoBase<>InizioCurvaDiPiccoEventoBase Then Progressione.b=True
 If NuovaFineCurvaDiPiccoEventoBase<>FineCurvaDiPiccoEventoBase Then Progressione=True
 If Progressione=True
  ProgressioneEventiMusicaliCurvaDiPicco{NuovoInizioCurvaDiPiccoEventoBase,NuovaFineCurvaDiPiccoEventoBase}
  InizioCurvaDiPiccoEventoBase=NuovoInizioCurvaDiPiccoEventoBase
  FineCurvaDiPiccoEventoBase=NuovaFineCurvaDiPiccoEventoBase
 EndIf

;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioEventoBase)

 CloseWindow #FinestraCambioEventoBase
 Use Window #FinestraEditoreSequenza

;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza

End Statement

;---------------------------------------------------------------
;this procedure states the selected by mouse event new position
;questa procedura mostra la nuova posizione dell'evento selezionato col mouse
;-----------------------------------------------------------------------------
Statement MostraNuovaPosizioneEvento{XEvento.l,YEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED TipoDiEventoMusicaleDiBase$
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 X0.w=16+(XEvento-XInizioAreaVisibile)/ScalaEventiMusicali
 Select TipoDiEventoMusicaleDiBase$
 Case "Note"
  Y0.w=(127-YInizioAreaVisibile-YEvento)*8
  X1.w=X0+(LarghezzaEventoBase-1)/ScalaEventiMusicali
 Case "Program"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Program000X")*8-1
 Case "Control"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Control000X")*8-1
 Case "PolyAftertouch"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Poly000X")*8-1
 Case "MonoAftertouch"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Mono000X")*8-1
 Case "PitchBend"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Bend+0000X")*8-1
 Case "Tempo"
  Y0=(AreaVisibileDeiValori-1)*1.0*(127-YEvento)/127
  X1=X0+Len("Tempo00/000X")*8-1
 Case "BPM"
  Y0=(AreaVisibileDeiValori-1)*1.0*(97-YEvento)/97
  X1=X0+Len("BPM000X")*8-1
 End Select
 Y1.w=Y0+7
 X0=Min(Max(X0,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y0=Min(Max(Y0,0),AltezzaInternaFinestraEditoreSequenza-1-8-8-7)
 X1=Min(Max(X1,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y1=Min(Max(Y1,7),AltezzaInternaFinestraEditoreSequenza-1-8-8)
 WJam #SecondaVoltaStessoColore
 If MostraNuovoValore=True
  WLocate X0,Y0
  Select TipoDiEventoMusicaleDiBase$
  Case "Note"
   Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
  Case "Program"
   Format "000":Print "Program",Str$(YEvento),"X":Format ""
  Case "Control"
   Format "000":Print "Control",Str$(YEvento),"X":Format ""
  Case "PolyAftertouch"
   Format "000":Print "Poly",Str$(YEvento),"X":Format ""
  Case "MonoAftertouch"
   Format "000":Print "Mono",Str$(YEvento),"X":Format ""
  Case "PitchBend"
   Format "+0000":Print "Bend",Str$(YEvento*128+EventoMusicale()\Valore-#_PitchBendCenter),"X":Format ""
  Case "Tempo"
   Format "00":Tempo$="Tempo"+Str$(YEvento MOD 16+1)
   Format "000":Tempo$+"/"+Str$(2^(YEvento/16)):Format ""
  Case "BPM"
   Format "000":Print "BPM",Str$(9+YEvento*3+EventoMusicale()\Valore),"X":Format ""
  End Select
 Else
  Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
 EndIf
 WJam #DueColoriConSfondoPieno
End Statement

;------------------------------------------------------------------------------
;questa procedura permette di spostare gli eventi selezionati cliccando con il
; mouse su uno di essi
;this procedure permits to move the selected events clicking on one of these
;----------------------------------------------------------------------------
Statement MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaEventoBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
 XPosizioneEvento/LarghezzaEventoBase*LarghezzaEventoBase
 Repeat
  NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY:TastoPremutoDelTopo.b=Joyb(0)
  NuovaXTopo=Min(Max(NuovaXTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
  NuovaYTopo=Min(Max(NuovaYTopo,0),AreaVisibileDeiValori-1)
  TipoDiEventoMusicale$=EventoMusicale()\Tipo
  CanaleEvento.b=EventoMusicale()\Canale
  Select TipoDiEventoMusicale$
  Case "Note"
   XNuovaPosizioneNota.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneNota/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneNota<>XPosizioneEvento
    IncrementoXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
   If YNuovaPosizioneNota<>YPosizioneEvento
    IncrementoYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Note>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Program"
   XNuovaPosizioneProgramma.l=XInizioAreaVisbile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneProgramma/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneProgramma<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneProgramma-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneProgramma.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizioneProgramma<0
    If NuovaYTopo<0 Then YNuovaPosizioneProgramma=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizioneProgramma=0
   EndIf
   If YNuovaPosizioneProgramma<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneProgramma-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Program>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Control"
   XNuovaPosizioneControllo.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneControllo/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneControllo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneControllo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneControllo.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizioneControllo<0
    If NuovaYTopo<0 Then YNuovaPosizioneControllo=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizioneControllo=0
   EndIf
   If YNuovaPosizioneControllo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneControllo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Control>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "PolyAftertouch"
   XNuovaPosizionePressioneMultipla.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizionePressioneMultipla/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizionePressioneMultipla<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizionePressioneMultipla-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizionePressioneMultipla.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizionePressioneMultipla<0
    If NuovaYTopo<0 Then YNuovaPosizionePressioneMultipla=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizionePressioneMultipla=0
   EndIf
   If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizionePressioneMultipla-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Poly>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "MonoAftertouch"
   XNuovaPosizionePressioneSingola.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizionePressioneSingola/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizionePressioneSingola<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizionePressioneSingola-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizionePressioneSingola.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizionePressioneSingola<0
    If NuovaYTopo<0 Then YNuovaPosizionePressioneSingola=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizionePressioneSingola=0
   EndIf
   If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizionePressioneSingola-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Mono>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "PitchBend"
   XNuovaPosizioneCurvaDiPicco.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneCurvaDiPicco/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneCurvaDiPicco<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneCurvaDiPicco-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneCurvaDiPicco.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizioneCurvaDiPicco<0
    If NuovaYTopo<0 Then YNuovaPosizioneCurvaDiPicco=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizioneCurvaDiPicco=0
   EndIf
   If YNuovaPosizioneCurvaDiPicco<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneCurvaDiPicco-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Bend>"+Str$(IncrementoYEventoMusicale*128)
   EndIf
  Case "Tempo"
   XNuovaPosizioneTempo.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneTempo/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneTempo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneTempo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneTempo.b=127-NuovaYTopo*1.0*127/(AreaVisibileDeiValori-1)
   If YNuovaPosizioneTempo<0
    If NuovaYTopo<0 Then YNuovaPosizioneTempo=127
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizioneTempo=0
   EndIf
   If YNuovaPosizioneTempo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneTempo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    NuoviBattiti.b=IncrementoYEventoMusicale MOD 16+1
    NuoveMisure.w=2^Abs(IncrementoYEventoMusicale/16)
    Messaggio$="Tempo>":If Sgn(IncrementoYEventoMusicale)=-1 Then Messaggio$+"-"
    Format "00":Messaggio$="Tempo"+Str$(NuoviBattiti)
    Format "000":Messaggio$+"/"+Str$(NuoveMisure)
    Format ""
   EndIf
  Case "BPM"
   XNuovaPosizioneBattutePerMinuto.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneBattutePerMinuto/LarghezzaEventoBase*LarghezzaEventoBase
   If XNuovaPosizioneBattutePerMinuto<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneBattutePerMinuto-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   YNuovaPosizioneBattutePerMinuto.b=97-NuovaYTopo*1.0*97/(AreaVisibileDeiValori-1)
   If YNuovaPosizioneBattutePerMinuto<0

;---------------------------------------------------------------------------
;il valore massimo per le battute per minuto e' di 97*3, cioe' 291, piu' il
; valore di partenza che e' 10, meno 1 dato che questo e' compreso, fa 300
;the maximum value for BPM events is 97*3, that is 291, plus the start value
; that is 10, minus 1 seen that this is included, it gives 300
;--------------------------------------------------------------
    If NuovaYTopo<0 Then YNuovaPosizioneBattutePerMinuto=97:EventoMusicale()\Valore=0

;----------------------------------------------------------------------------
;il valore minimo per le battute per minuto e' di 10, che corrisponde a zero
; dato che viene sommato in seguito
;the minimum value for BPM events is 10, that correspond to zero seen that it
; is added after
;----------------
    If NuovaYTopo>(AreaVisibileDeiValori-1) Then YNuovaPosizioneBattutePerMinuto=0:EventoMusicale()\Valore=1

   EndIf
   If YNuovaPosizioneBattutePerMinuto<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneBattutePerMinuto-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    BattutePerMinuto.w=IncrementoYEventoMusicale*3
    Messaggio$="BPM>"+Str$(BattutePerMinuto)
   EndIf
  End Select
  Select TipoDiEventoMusicale$
  Case "Note"
   NuovaXEvento.l=XNuovaPosizioneNota:NuovaYEvento.b=YNuovaPosizioneNota
  Case "Program"
   NuovaXEvento=XNuovaPosizioneProgramma:NuovaYEvento=YNuovaPosizioneProgramma
  Case "Control"
   NuovaXEvento=XNuovaPosizioneControllo:NuovaYEvento=YNuovaPosizioneControllo
  Case "PolyAftertouch"
   NuovaXEvento=XNuovaPosizionePressioneMultipla:NuovaYEvento=YNuovaPosizionePressioneMultipla
  Case "MonoAftertouch"
   NuovaXEvento=XNuovaPosizionePressioneSingola:NuovaYEvento=YNuovaPosizionePressioneSingola
  Case "PitchBend"
   NuovaXEvento=XNuovaPosizioneCurvaDiPicco:NuovaYEvento=YNuovaPosizioneCurvaDiPicco
  Case "Tempo"
   NuovaXEvento=XNuovaPosizioneTempo:NuovaYEvento=YNuovaPosizioneTempo
  Case "BPM"
   NuovaXEvento=XNuovaPosizioneBattutePerMinuto:NuovaYEvento=YNuovaPosizioneBattutePerMinuto
  End Select
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
  If EventoMusicaleSpostatoConIlTopo=False
   Messaggio$="No change made"
  EndIf
  XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  WColour CanaleSelezionato-1,16-CanaleSelezionato
  Print Messaggio$
  If EventoMusicaleSpostatoConIlTopo=True
   Print " pos>":ConvertiIlTempoInBattute{IncrementoXEventoMusicale,1}
  EndIf
  VWait
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
 Until TastoPremutoDelTopo<>#TastoSinistroDelTopoPremuto
 If EventoMusicaleSpostatoConIlTopo=True
  PushItem EventoMusicale()
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    StatoEventoMusicale.b=EventoMusicale()\Stato
    SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
    If EventoMusicale()\Tipo=TipoDiEventoMusicale$ AND SelezioneEventoMusicale=#EventoMusicaleSelezionato
     EventoMusicale()\Evento+IncrementoYEventoMusicale
     If TipoDiEventoMusicale$="BPM"
      EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),97)
      If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
      If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
     Else
      EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),127)
     EndIf
     EventoMusicale()\Inizio+IncrementoXEventoMusicale
     If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
     DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
    EndIf
   EndIf
  Wend
  PopItem EventoMusicale()
 EndIf
End Statement

;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
SHARED VoceUsata
 For Suono.b=0 To 31
  If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForEsecutoreNote
 Next Suono
FineCicloForEsecutoreNote
 If Suono<32
  If Suono(Suono)\Canale>0
   Periodo.l=PeriFreq(Nota)\Periodo
   If Periodo>=#PeriodoMinimo AND Periodo<65536
    If VoceSpenta>0
     If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
     If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
     If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
     If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
    EndIf
SuonaCampione
    SetPeriod Suono,Periodo:Sound Suono,Voce
    VoceUsata | Voce
    Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
    NoteSuonate+1
   EndIf
  EndIf
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
   NoteSuonate+1
  EndIf
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleNota-1,16-CanaleNota
  Print Messaggio$
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure executes the program change
;-------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma.b,CanaleProgramma.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Programma
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Program>"+Str$(Programma)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleProgramma-1,16-CanaleProgramma
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure executes the control change
;-------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo.b,ValoreControllo,CanaleControllo.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Controllo
  WriteSerial 0,ValoreControllo
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleControllo-1,16-CanaleControllo
   Print Messaggio$
  EndIf
 EndIf
End Statement

;----------------------------------------------
;questa procedura esegue la pressione multipla
;this procedure executes the polyphonic pressure
;------------------------------------------------
Statement EseguiLaPressioneMultipla{PressioneMultipla.b,CanalePressioneMultipla.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_PolyphonicKeyPressure+(CanalePressioneMultipla-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,PressioneMultipla
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Poly>"+Str$(PressioneMultipla)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanalePressioneMultipla-1,16-CanalePressioneMultipla
   Print Messaggio$
  EndIf
 EndIf
End Statement

;---------------------------------------------
;questa procedura esegue la pressione singola
;this procedure executes the single pressure
;--------------------------------------------
Statement EseguiLaPressioneSingola{PressioneSingola.b,CanalePressioneSingola.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ChannelKeyPressure+(CanalePressioneSingola-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,PressioneMultipla
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Mono>"+Str$(PressioneMultipla)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanalePressioneSingola-1,16-CanalePressioneSingola
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue la variazione di picco
;this procedure executes the pitch bending
;------------------------------------------
Statement EseguiLaCurvaDiPicco{CurvaDiPicco.w,CanaleCurvaDiPicco.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_PitchBend+(CanaleCurvaDiPicco-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,CurvaDiPicco MOD 128
  WriteSerial 0,CurvaDiPicco/128
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Bend>"+Str$(CurvaDiPicco-#_PitchBendCenter)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleCurvaDiPicco-1,16-CanaleCurvaDiPicco
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
SHARED VoceUsata
 For Suono.b=0 To 31
  If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForTerminatoreNote
 Next Suono
FineCicloForTerminatoreNote
 If Suono<32
  If Suono(Suono)\Canale>0
   If VoceUsata>0
    If VoceUsata BitTst 0=True Then Voce.b=1:Goto FermaCampione
    If VoceUsata BitTst 1=True Then Voce=2:Goto FermaCampione
    If VoceUsata BitTst 2=True Then Voce=4:Goto FermaCampione
    If VoceUsata BitTst 3=True Then Voce=8
FermaCampione
    Quiet Voce
    VoceSpenta | Voce
    Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
    NoteSuonate-1
   EndIf
  EndIf
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
   NoteSuonate-1
  EndIf
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$+" stopped"
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleNota-1,16-CanaleNota
  Print Messaggio$
 EndIf
End Statement

;---------------------------------------------------------
;questa procedura mostra gli slider dell'editore sequenza
;this procedure shows the sequence editor's sliders
;---------------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
 If AreaInvisibileDelTempo=0
  Disable #ListaGadgetEditoreSequenza,2
  XInizioAreaVisibile=0
 Else
  Enable #ListaGadgetEditoreSequenza,2
 EndIf
 MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement

;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
 For Tasto.b=0 To 127-AreaInvisibileDelleNote
  Nota.b=127-Tasto-YInizioAreaVisibile
  Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
  If TipoDiNota(Nota)\Diesis=True
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
   WColour 3,0
  Else
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
   WColour 0,3
  EndIf
  WLocate 16,Y0Nota
  Print "Note ",Nota,">"
  Print TipoDiNota(Nota)\NomeInglese
  Print "-"
  Print TipoDiNota(Nota)\NomeItaliano
  Print TipoDiNota(Nota)\Ottava
 Next Tasto
End Statement

;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED Battiti
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED Spazio$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
 Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
 NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
 LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+Spazio$)*8
 FineTempo.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
 If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
 Battito.b=1
 Misura.l=1
 Tempo.l=0
 Repeat
  PushItem EventoMusicale()
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata AND EventoMusicale()\Inizio<=Tempo
    EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
    If EventoMusicale()\Tipo="Tempo" AND EventoMusicaleEseguito=0
     NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
     NuoveMisure.w=2^(EventoMusicale()\Evento/16)
     If Battito>1
      Battito=1
      Misura+1
     EndIf
     TempoCambiato=True
     EventoMusicale()\Stato | #EventoMusicaleEseguito
    EndIf
   EndIf
  Wend
  PopItem EventoMusicale()
  XTempo.l=16+(Tempo-XInizioAreaVisibile)/ScalaEventiMusicali
  If XTempo>16+LarghezzaTesto-1
   WLocate XTempo,(127-AreaInvisibileDelleNote)*8
   Print Misura,".",Battito
   If TempoCambiato=True
    Tic.w=Tempo MOD (#TicDiBasePerQuarto/(NuoveMisure/4.0))
   Else
    Tic=Tempo MOD (#TicDiBasePerQuarto/(Misure/4.0))
   EndIf
   If Tic>0 Then Print ".",Tic
  EndIf
  Battute.b=Max(ScalaEventiMusicali/4,1)
  If TempoCambiato=True
   IncrementoTempo.w=(#TicDiBasePerQuarto*4.0*Battute)/NuoveMisure
  Else
   IncrementoTempo=(#TicDiBasePerQuarto*4.0*Battute)/Misure
  EndIf
  Battito+Battute
  Tempo+IncrementoTempo
  If TempoCambiato=True
   If Battito>NuoviBattiti Then Misura+Battito/NuoveMisure:Battito=1
  Else
   If Battito>Battiti Then Misura+Battito/Misure:Battito=1
  EndIf
 Until Tempo>FineTempo
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Tipo="Tempo"
   EventoMusicaleEseguito=EventoMusicale()\Stato & #EventoMusicaleEseguito
   If EventoMusicaleEseguito=#EventoMusicaleEseguito
    EventoMusicale()\Stato & %11110111
   EndIf
  EndIf
 Wend
End Statement

;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows the musical events
;----------------------------------------
Statement MostraGliEventiMusicali{}
SHARED CanaleSelezionato
SHARED EventoMusicale()
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED SequenzaSelezionata
SHARED TipoDiEventoMusicaleDiBase$
; PushItem EventoMusicale()
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Sequenza=SequenzaSelezionata
   TipoDiEventoMusicale$=EventoMusicale()\Tipo
   If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
    CanaleEvento.b=EventoMusicale()\Canale
    If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
     InizioEvento.l=EventoMusicale()\Inizio
     StatoEvento.b=EventoMusicale()\Stato
     Select TipoDiEventoMusicale$
     Case "Note"
      Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
      DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,StatoEvento}
     Case "Program"
      Programma.b=EventoMusicale()\Evento
      DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "Control"
      Controllo.b=EventoMusicale()\Evento
      DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "PolyAftertouch"
      PressioneMultipla.b=EventoMusicale()\Evento
      DisegnaUnEventoMusicale{"PolyAftertouch",PressioneMultipla,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "MonoAftertouch"
      PressioneSingola.b=EventoMusicale()\Evento
      DisegnaUnEventoMusicale{"MonoAftertouch",PressioneSingola,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "PitchBend"
      CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
      DisegnaUnEventoMusicale{"PitchBend",CurvaDiPicco,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "Tempo"
      Tempo.b=EventoMusicale()\Evento
      DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,StatoEvento}
     Case "BPM"
      BattutePerMinuto.w=9+EventoMusicale()\Evento*3+EventoMusicale()\Valore
      DisegnaUnEventoMusicale{"BPM",BattutePerMinuto,InizioEvento,0,CanaleEvento,StatoEvento}
     End Select
    EndIf
   EndIf
  EndIf
 Wend
; PopItem EventoMusicale()
End Statement

;----------------------------------------------------------
;questa procedura interrompe l'esecuzione di tutte le note
;this procedure stops all notes execution
;-----------------------------------------
Statement InterrompiTutteLeNote{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
   WJam #DueColoriConSfondoPieno
   WLocate 0,0:WColour 0,0:Print SPACE$(80)
   WLocate 0,0:WColour 3:Print "Resetting MIDI devices, please wait..."
   WJam #UnColoreConSfondoTrasparente
  EndIf
  For Canale.b=1 To 16
   EseguiIlCambioDiControllo{#_AllNotesOff,127,Canale,Modo}
   EseguiIlCambioDiControllo{#_ResetCtrl,127,Canale,Modo}
  Next Canale
 EndIf
 Quiet %1111
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$="All notes off"
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour 1,0
  Print Messaggio$
 EndIf
End Statement

Statement AggiungiUnaNotaDallaTastiera{Nota$}
SHARED AreaInvisibileDelleNote
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED NotaSuonata
SHARED OttavaSelezionata
SHARED PuntoDInserimento
SHARED SequenzaSelezionata
SHARED ValoreEventoBase
 Select Nota$
 Case "C1"
  Nota.b=0
 Case "C#1"
  Nota=1
 Case "D1"
  Nota=2
 Case "D#1"
  Nota=3
 Case "E1"
  Nota=4
 Case "F1"
  Nota=5
 Case "F#1"
  Nota=6
 Case "G1"
  Nota=7
 Case "G#1"
  Nota=8
 Case "A1"
  Nota=9
 Case "A#1"
  Nota=10
 Case "B1"
  Nota=11
 Case "C2"
  Nota=12
 Case "C#2"
  Nota=13
 Case "D2"
  Nota=14
 Case "D#2"
  Nota=15
 Case "E2"
  Nota=16
 Case "F2"
  Nota=17
 Case "F#2"
  Nota=18
 Case "G2"
  Nota=19
 Case "G#2"
  Nota=20
 Case "A2"
  Nota=21
 Case "A#2"
  Nota=22
 Case "B2"
  Nota=23
 End Select
 Nota+OttavaSelezionata*12:Nota=Min(Nota,127)
 If CanaleSelezionato>0
  LastItem EventoMusicale()
  If AddItem(EventoMusicale())=True
   EventiMusicali+1
   EventoMusicale()\Tipo="Note"
   EventoMusicale()\Evento=Nota
   EventoMusicale()\Valore=ValoreEventoBase
   EventoMusicale()\Inizio=PuntoDInserimento
   EventoMusicale()\Canale=CanaleSelezionato
   EventoMusicale()\Sequenza=SequenzaSelezionata
   EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
   EventoMusicale()\Durata=LarghezzaEventoBase
   If NotaSuonata\Stato=True
    Nota.b=NotaSuonata\Evento
    VelocitaNota.b=NotaSuonata\Valore
    CanaleNota.b=NotaSuonata\Canale
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
   EndIf
   NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Valore,EventoMusicale()\Inizio,EventoMusicale()\Durata
   NotaSuonata\Canale=EventoMusicale()\Canale
   SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
   NotaSuonata\Stato=True
   PuntoDInserimento+LarghezzaEventoBase
   DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
  Else
   EZRequest "AmySequencer message","You have used all the available events","OK"
  EndIf
 Else
  EZRequest "AmySequencer message","You must select a channel first","OK"
 EndIf
End Statement

;-------------------------------------------------------
;questa procedura imposta il menu dell'editore sequenza
;this procedure sets the sequence editor menu
;---------------------------------------------
Statement ImpostaMenuEditoreSequenza{}
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED MostraNuovoValore
SHARED TipoDiEventoMusicaleDiBase$

 Free MenuList #ListaMenuEditoreSequenza

 MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
 MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"
 MenuItem #ListaMenuEditoreSequenza,0,0,1,"Record"
 MenuItem #ListaMenuEditoreSequenza,0,0,2,"Stop"

 MenuTitle #ListaMenuEditoreSequenza,1,"Edit"
 MenuItem #ListaMenuEditoreSequenza,0,1,0,"All"
 MenuItem #ListaMenuEditoreSequenza,0,1,1,"None"
 MenuItem #ListaMenuEditoreSequenza,0,1,2,"Toggle"
 MenuItem #ListaMenuEditoreSequenza,0,1,3,"Cut"
 MenuItem #ListaMenuEditoreSequenza,0,1,4,"Copy"
 MenuItem #ListaMenuEditoreSequenza,0,1,5,"Paste"
 MenuItem #ListaMenuEditoreSequenza,0,1,6,"Forget"
 MenuItem #ListaMenuEditoreSequenza,0,1,7,"Goto"

 MenuTitle #ListaMenuEditoreSequenza,2,"Event type"
 Select TipoDiEventoMusicaleDiBase$
 Case "Note"
  MenuItem #ListaMenuEditoreSequenza,4,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,4,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,4,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "PolyAftertouch"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,4,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "MonoAftertouch"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,4,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,4,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,4,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,2,7,"  BPM"
 Case "BPM"
  MenuItem #ListaMenuEditoreSequenza,2,2,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,2,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,2,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,2,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,2,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,2,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,4,2,7,"  BPM"
 End Select
 If MostraSoloGliEventiMusicaliDelloStessoTipo=True
  MenuItem #ListaMenuEditoreSequenza,3,2,8,"  Alone"
 Else
  MenuItem #ListaMenuEditoreSequenza,1,2,8,"  Alone"
 EndIf

 MenuTitle #ListaMenuEditoreSequenza,3,"Settings"
 MenuItem #ListaMenuEditoreSequenza,0,3,0,"Basic event"
 If MostraNuovoValore=True
  MenuItem #ListaMenuEditoreSequenza,3,3,1,"  Show dragged event value"
 Else
  MenuItem #ListaMenuEditoreSequenza,1,3,1,"  Show dragged event value"
 EndIf

 MenuTitle #ListaMenuEditoreSequenza,4,"Help"
 MenuItem #ListaMenuEditoreSequenza,0,4,0,"Keys to use"
 MenuItem #ListaMenuEditoreSequenza,0,4,1,"Notes on keys"

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSequenza

End Statement

;------------------------------------------------------------
;questa procedura selezione e/o modifica gli eventi musicali
;this procedure selectes and/or modifies the musical events
;-----------------------------------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSelezionato
SHARED EventoMusicaleSpostatoConIlTopo
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED MIDIAttivato
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED NotaSuonata
SHARED PeriFreq()
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TastoDelTopoCliccato
SHARED TipoDiEventoMusicaleDiBase$
SHARED ValoreEventoBase
SHARED XInizioAreaVisibile
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YTopo
 ResetList EventoMusicale()
 XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
 YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori-1)
 StessoEvento.b=%00000
 While NextItem(EventoMusicale())=True
  StessoEvento=%00000
  TipoDiEventoMusicale$=EventoMusicale()\Tipo
  If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
   CanaleEvento.b=EventoMusicale()\Canale
   If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
    InizioEvento.l=EventoMusicale()\Inizio
    SequenzaEvento.w=EventoMusicale()\Sequenza
    SelezioneEventoMusicale.b=EventoMusicale()\Stato & #EventoMusicaleSelezionato
    EventoMusicaleTagliato.b=EventoMusicale()\Stato & #EventoMusicaleTagliato
    EventoMusicaleCopiato.b=EventoMusicale()\Stato & #EventoMusicaleCopiato
    If Modo=#SelezionaUnEventoMusicale
     Select TipoDiEventoMusicale$
     Case "Note"
      Nota.b=Min(Max(EventoMusicale()\Evento,0),127)
      DurataNota.l=EventoMusicale()\Durata
      FineNota.l=InizioEvento+DurataNota-1
      VelocitaNota.b=EventoMusicale()\Valore
      XPosizioneNota.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneNota.b=127-YInizioAreaVisibile-YTopo/8
      If XPosizioneNota>=InizioEvento Then StessoEvento | %00001
      If XPosizioneNota<=FineNota Then StessoEvento | %00010
      If YPosizioneNota=Nota Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new note|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneNota,YPosizioneNota}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        Else
         Nota=EventoMusicale()\Evento
         InizioNota=EventoMusicale()\Inizio
        EndIf
       Else
        NotaPiuLunga.l=DurataNota
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       NotaSuonata\Evento=Nota,VelocitaNota,0,DurataNota,CanaleEvento
       SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
       NotaSuonata\Stato=True
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "Program"
      Programma.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento.w=Len("Program000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FineProgramma.w=InizioEvento+LunghezzaEvento-1
      XPosizioneProgramma.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneProgramma.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizioneProgramma>=InizioEvento Then StessoEvento | %00001
      If XPosizioneProgramma<=FineProgramma Then StessoEvento | %00010
      If YPosizioneProgramma=Programma Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new program|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneProgramma,YPosizioneProgramma}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "Control"
      Controllo.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("Control000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FineControllo.w=InizioEvento+LunghezzaEvento-1
      XPosizioneControllo.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneControllo.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizioneControllo>=InizioEvento Then StessoEvento | %00001
      If XPosizioneControllo<=FineControllo Then StessoEvento | %00010
      If YPosizioneControllo=Controllo Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new control|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneControllo,YPosizioneControllo}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "PolyAftertouch"
      PressioneMultipla.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("Poly000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FinePressioneMultipla.w=InizioEvento+LunghezzaEvento-1
      XPosizionePressioneMultipla.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizionePressioneMultipla.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizionePressioneMultipla>=InizioEvento Then StessoEvento | %00001
      If XPosizionePressioneMultipla<=FinePressioneMultipla Then StessoEvento | %00010
      If YPosizionePressioneMultipla=PressioneMultipla Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new poly|pressure with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneMultipla,YPosizionePressioneMultipla}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "MonoAftertouch"
      PressioneSingola.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("Mono000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FinePressioneSingola.w=InizioEvento+LunghezzaEvento-1
      XPosizionePressioneSingola.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizionePressioneSingola.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizionePressioneSingola>=InizioEvento Then StessoEvento | %00001
      If XPosizionePressioneSingola<=FinePressioneSingola Then StessoEvento | %00010
      If YPosizionePressioneSingola=PressioneSingola Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new mono|pressure with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneSingola,YPosizionePressioneSingola}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "PitchBend"
      CurvaDiPicco.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("Bend+0000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FineCurvaDiPicco.w=InizioEvento+LunghezzaEvento-1
      XPosizioneCurvaDiPicco.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneCurvaDiPicco.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizioneCurvaDiPicco>=InizioEvento Then StessoEvento | %00001
      If XPosizioneCurvaDiPicco<=FineCurvaDiPicco Then StessoEvento | %00010
      If YPosizioneCurvaDiPicco=CurvaDiPicco Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new pitch bend|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneCurvaDiPicco,YPosizioneCurvaDiPicco}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "Tempo"
      Tempo.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("Tempo00/000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FineTempo.w=InizioEvento+LunghezzaEvento-1
      XPosizioneTempo.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneTempo.b=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
      If XPosizioneTempo>=InizioEvento Then StessoEvento | %00001
      If XPosizioneTempo<=FineTempo Then StessoEvento | %00010
      If YPosizioneTempo=Tempo Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new tempo|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneTempo,YPosizioneTempo}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     Case "BPM"
      BattutePerMinuto.b=Min(Max(EventoMusicale()\Evento,0),127)
      LunghezzaEvento=Len("BPM000")*8
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
      FineBattutePerMinuto.w=InizioEvento+LunghezzaEvento-1
      XPosizioneBattutePerMinuto.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
      YPosizioneBattutePerMinuto.b=97-YTopo*1.0*97/(AreaVisibileDeiValori-1)
      If XPosizioneBattutePerMinuto>=InizioEvento Then StessoEvento | %00001
      If XPosizioneBattutePerMinuto<=FineBattutePerMinuto Then StessoEvento | %00010
      If YPosizioneBattutePerMinuto=BattutePerMinuto Then StessoEvento | %00100
      If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
      If StessoEvento=%01111
       If CanaleSelezionato<>CanaleEvento
        If CanaleSelezionato=0
         CanaleSelezionato=CanaleEvento
         Format "00"
         WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
         WColour CanaleSelezionato-1,16-CanaleSelezionato
         Print Str$(CanaleSelezionato)
         Format ""
         StessoEvento | %10000
        Else
         AggiungiEvento=EZRequest("AmySequencer message","Would you add a new BPM|with the current channel?","Yes|No")
         If AggiungiEvento=1
          CanaleEvento=CanaleSelezionato
         Else
          Format "00"
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          If ColoriOriginali=True
           WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
          Else
           WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
          EndIf
          Print Str$(CanaleSelezionato)
          CanaleSelezionato=CanaleEvento
          WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
          WColour CanaleSelezionato-1,16-CanaleSelezionato
          Print Str$(CanaleSelezionato)
          Format ""
          StessoEvento | %10000
         EndIf
        EndIf
;       Else
;        EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
;        TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
;        ImpostaMenuEditoreSequenza{}
;        StessoEvento | %10000
;        Pop If:Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
       EndIf
       If SelezioneEventoMusicale=#EventoMusicaleSelezionato
        If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
         MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneBattutePerMinuto,YPosizioneBattutePerMinuto}
        EndIf
        If EventoMusicaleSpostatoConIlTopo=False
         EventiMusicaliSelezionati-1
         EventoMusicale()\Stato & %11111110
        EndIf
       Else
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EndIf
       EventoMusicaleSelezionato=EventoMusicale()\Evento
       TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
       ImpostaMenuEditoreSequenza{}
       StessoEvento | %10000
       Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
      EndIf
     End Select
    Else
     If EventoMusicale()\Sequenza=SequenzaSelezionata
      If SelezioneEventoMusicale=#EventoMusicaleSelezionato
       Select Modo
       Case #CambiaIlCanaleDegliEventiMusicaliSelezionati
        EventoMusicale()\Canale=CanaleSelezionato
       Case #AlzaDiUnoGliEventiMusicaliSelezionati
        If TipoDiEventoMusicale$="BPM"
         If EventoMusicale()\Evento<97
          EventoMusicale()\Valore+1
          If EventoMusicale()\Valore>2
           EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
          EndIf
         EndIf
        Else
         If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
        EndIf
       Case #AbbassaDiUnoGliEventiMusicaliSelezionati
        If TipoDiEventoMusicale$="BPM"
         If EventoMusicale()\Evento>0
          EventoMusicale()\Valore-1
          If EventoMusicale()\Valore<0
           EventoMusicale()\Valore=2:EventoMusicale()\Evento-1
          EndIf
         Else
          If EventoMusicale()\Valore>1 Then EventoMusicale()\Valore-1
         EndIf
        Else
         If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
        EndIf
       Case #SpostaAvantiNelTempoGliEventiMusicaliSelezionati
        EventoMusicale()\Inizio+LarghezzaEventoBase
       Case #SpostaIndietroNelTempoGliEventiMusicaliSelezionati
        EventoMusicale()\Inizio-LarghezzaEventoBase:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
       Case #EliminaGliEventiMusicaliSelezionati
        DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
        EventoMusicale()\Tipo="",0,0,0,0,0,0,0:KillItem EventoMusicale()
        EventiMusicali-1:EventiMusicaliSelezionati-1
        If EventiMusicali=0 Then DurataSequenza=0
       Case #DeselezionaTuttiGliEventiMusicali
        EventiMusicaliSelezionati-1
        EventoMusicale()\Stato & %11111110
       Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
        EventiMusicaliSelezionati-1
        EventoMusicale()\Stato & %11111110
       Case #TagliaGliEventiMusicaliSelezionati
        EventoMusicale()\Stato | #EventoMusicaleTagliato
       Case #CopiaGliEventiMusicaliSelezionati
        EventoMusicale()\Stato | #EventoMusicaleCopiato
       End Select
       Select TipoDiEventoMusicale$
       Case "Note"
        Select Modo
        Case #AllungaLaDurataDelleNoteSelezionate
         If EventoMusicale()\Durata=#_MClksPerSP
          EventoMusicale()\Durata=LarghezzaEventoBase
         Else
          EventoMusicale()\Durata+LarghezzaEventoBase
         EndIf
         NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
         DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
        Case #RiduciLaDurataDelleNoteSelezionate
         EventoMusicale()\Durata-LarghezzaEventoBase
         EventoMusicale()\Durata=Max(EventoMusicale()\Durata,#_MClksPerSP)
         NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
        Case #AlzaDiUnOttavaLeNoteSelezionate
         EventoMusicale()\Evento+12
         EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
        Case #AbbassaDiUnOttavaLeNoteSelezionate
         EventoMusicale()\Evento-12
         EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
        Case #CambiaIlValoreDegliEventiMusicaliSelezionati
         EventoMusicale()\Valore=ValoreEventoBase
        End Select
       Case "Tempo"
        NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
        NuoveMisure.w=2^(EventoMusicale()\Evento/16)
        Select Modo
        Case #AggiungiUnBattitoAlTempoSelezionato
         NuoviBattiti+1
         NuoviBattiti=Min(NuoviBattiti,16)
        Case #TogliUnBattitoAlTempoSelezionato
         NuoviBattiti-1
         NuoviBattiti=Max(NuoviBattiti,1)
        Case #AggiungiUnaMisuraAlTempoSelezionato
         NuoveMisure+NuoveMisure
         NuoveMisure=Min(NuoveMisure,128)
        Case #TogliUnaMisuraAlTempoSelezionato
         NuoveMisure/2
         NuoveMisure=Max(NuoveMisure,1)
        End Select
        EventoMusicale()\Evento=EsponenteDiDue{NuoveMisure}*16+NuoviBattiti-1
       Case "BPM"
        Select Modo
        Case #AggiungiDieciAgliEventiMusicaliSelezionati
         If EventoMusicale()\Evento<94
          EventoMusicale()\Evento+3
          EventoMusicale()\Valore+1
          If EventoMusicale()\Valore>2
           EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
          EndIf
         EndIf
        Case #SottraiDieciAgliEventiMusicaliSelezionati
         If EventoMusicale()\Evento>3
          EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
          If EventoMusicale()\Valore<0
           EventoMusicale()\Evento-1:EventoMusicale()\Valore=2
          EndIf
         Else
          If EventoMusicale()\Evento>2 AND EventoMusicale()\Valore>1
           EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
          EndIf
         EndIf
        End Select
       Default
        EventoMusicale.w=EventoMusicale()\Evento
        Select Modo
        Case #AggiungiOttoAgliEventiMusicaliSelezionati
         EventoMusicale+8:EventoMusicale()\Evento=Min(EventoMusicale,127)
        Case #SottraiOttoAgliEventiMusicaliSelezionati
         EventoMusicale-8:EventoMusicale()\Evento=Max(EventoMusicale,0)
        End Select
       End Select
      Else
       Select Modo
       Case #SelezionaTuttiGliEventiMusicali
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
        EventiMusicaliSelezionati+1
        EventoMusicale()\Stato | #EventoMusicaleSelezionato
       End Select
      EndIf
      If Modo=#IncollaGliEventiMusicali AND EventoMusicaleTagliato=#EventoMusicaleTagliato
       EventoMusicale()\Inizio+PuntoDInserimento
       EventoMusicale()\Stato & %11111101
       EventoMusicale()\Stato & #EventoMusicaleCopiato
      EndIf
     EndIf
    EndIf
   EndIf
  EndIf
 Wend
FineCicloWhileSelezione
 If Modo=#SelezionaUnEventoMusicale AND StessoEvento<%11111
  If CanaleSelezionato>0
   LastItem EventoMusicale()
   If AddItem(EventoMusicale())=True
    EventiMusicali+1
    EventoMusicale()\Inizio=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    EventoMusicale()\Canale=CanaleSelezionato
    EventoMusicale()\Sequenza=SequenzaSelezionata
    EventoMusicale()\Stato=0
    EventoMusicale()\Tipo=TipoDiEventoMusicaleDiBase$
    Select TipoDiEventoMusicaleDiBase$
    Case "Note"
     EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
     EventoMusicale()\Valore=ValoreEventoBase
     EventoMusicale()\Durata=LarghezzaEventoBase
     NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Valore,0,EventoMusicale()\Durata,EventoMusicale()\Canale
     SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
     NotaSuonata\Stato=True
    Case "Program"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
    Case "Control"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
     EventoMusicale()\Valore=ValoreEventoBase
    Case "PolyAftertouch"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
    Case "MonoAftertouch"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
    Case "PitchBend"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
    Case "Tempo"
     EventoMusicale()\Evento=127-YTopo*1.0*127/(AreaVisibileDeiValori-1)
     EventoMusicale()\Durata=2
    Case "BPM"
     EventoMusicale()\Evento=97-YTopo*1.0*97/(AreaVisibileDeiValori-1)
     If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
     If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
     EventoMusicale()\Durata=2
    End Select
    DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
   Else
    EZRequest "AmySequencer message","You have used all the available events","OK"
   EndIf
  Else
   EZRequest "AmySequencer message","You must select a channel first","OK"
  EndIf
 EndIf
 If Modo=#IncollaGliEventiMusicali
  If CanaleSelezionato>0
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    SequenzaEvento=EventoMusicale()\Sequenza
    If SequenzaEvento=SequenzaSelezionata
     TipoDiEventoMusicale$=EventoMusicale()\Tipo
     If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
      CanaleEvento=EventoMusicale()\Canale
      If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
       EventoMusicaleCopiato=EventoMusicale()\Stato & #EventoMusicaleCopiato
       If EventoMusicaleCopiato=#EventoMusicaleCopiato
        EventoMusicale=EventoMusicale()\Evento
        ValoreEvento.b=EventoMusicale()\Valore
        InizioEvento=EventoMusicale()\Inizio
        DurataEvento.l=EventoMusicale()\Durata
        If DifferenzaPosizioneEventoMusicale.l=0 Then DifferenzaPosizioneEventoMusicale=PuntoDInserimento-InizioEvento
        PushItem EventoMusicale()
        LastItem EventoMusicale()
        If AddItem(EventoMusicale())=True
         EventiMusicali+1
         EventiMusicaliSelezionati+1
         EventoMusicale()\Tipo=TipoDiEventoMusicale$
         EventoMusicale()\Evento=EventoMusicale
         EventoMusicale()\Valore=ValoreEvento
         EventoMusicale()\Inizio=InizioEvento+DifferenzaPosizioneEventoMusicale
         EventoMusicale()\Durata=DurataEvento
         EventoMusicale()\Canale=CanaleEvento
         EventoMusicale()\Sequenza=SequenzaSelezionata
         EventoMusicale()\Stato=#EventoMusicaleSelezionato
         DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
        Else
         EZRequest "AmySequencer message","You have used all the available events","OK"
         PopItem EventoMusicale()
         Pop If:Pop If:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileIncollaturaEventiMusicali
        EndIf
        PopItem EventoMusicale()
       EndIf
      EndIf
     EndIf
    EndIf
   Wend
FineCicloWhileIncollaturaEventiMusicali
  Else
   EZRequest "AmySequencer message","You must select a channel first","OK"
  EndIf
 EndIf
 If Modo=#DimenticaGliEventiMusicaliTagliatiOCopiati
  If CanaleSelezionato>0
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    SequenzaEvento=EventoMusicale()\Sequenza
    If SequenzaEvento=SequenzaSelezionata
     TipoDiEventoMusicale$=EventoMusicale()\Tipo
     If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
      CanaleEvento=EventoMusicale()\Canale
      If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
       EventoMusicaleTagliato=EventoMusicale()\Stato & #EventoMusicaleTagliato
       If EventoMusicaleTagliato=#EventoMusicaleTagliato
        EventoMusicale()\Stato & %11111001
       EndIf
       EventoMusicaleCopiato=EventoMusicale()\Stato & #EventoMusicaleCopiato
       If EventoMusicaleCopiato=#EventoMusicaleCopiato
        EventoMusicale()\Stato & %11111001
       EndIf
      EndIf
     EndIf
    EndIf
   Wend
  Else
   EZRequest "AmySequencer message","You must select a channel first","OK"
  EndIf
 EndIf
 If Modo=#SelezionaGliEventiMusicaliUguali
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If  EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoMusicale()\Tipo="PitchBend"
     If EventoMusicale()\Evento*128+EventoMusicale()\Valore=EventoMusicaleSelezionato
      If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
       EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EventiMusicaliSelezionati+1
      EndIf
     EndIf
    Else
     If EventoMusicale()\Evento=EventoMusicaleSelezionato
      If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
       EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EventiMusicaliSelezionati+1
      EndIf
     EndIf
    EndIf
   EndIf
  Wend
 EndIf
 If NotaPiuLunga>0
  XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  WColour 3,0
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,0}
 EndIf
 DurataSequenza=0
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Sequenza=SequenzaSelezionata
   DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
  EndIf
 Wend
 LimiteMassimoXInizioAreaVisibile.l=Max(DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali,0)
 XInizioAreaVisibile=Min(XInizioAreaVisibile,LimiteMassimoXInizioAreaVisibile)
End Statement

;-------------------------------------------------------------------------
;questa procedura gestisce il titolo della finestra dell'editore sequenza
;this procedure handles the sequence editor window title
;--------------------------------------------------------
Statement MostraIlTitoloDellaFinestraDellEditoreSequenza{}
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED Sequenza()
SHARED SequenzaSelezionata
 TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+":"
 NomeSequenza$=Sequenza()\Nome
 If NomeSequenza$="" Then NomeSequenza$="unnamed"
 TitoloFinestra$+NomeSequenza$+"-"
 If EventiMusicali>0
  TitoloFinestra$+Str$(EventiMusicaliSelezionati)+" selected event"
  If EventiMusicaliSelezionati<>1 Then TitoloFinestra$+"s"
  TitoloFinestra$+" of "+Str$(EventiMusicali)+" event"
  If EventiMusicali<>1 Then TitoloFinestra$+"s"
 Else
  TitoloFinestra$+"no events into this sequence"
 EndIf
 WTitle TitoloFinestra$
End Statement

;----------------------------------------------
;questa procedura registra gli eventi musicali
;this procedure records the musical events
;------------------------------------------
Statement RegistraGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED Battiti
SHARED BattutePerMinuto
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaNellaTraccia()
SHARED SequenzaSelezionata
SHARED Spazio$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSu$
SHARED TastoFuga$
SHARED TipoDiEventoMusicaleDiBase$
SHARED XInizioAreaVisibile
 If SequenzaSelezionata>0
  Messaggio$="Begin recording?|If you'll choose|OK use CURSOR KEYS|UP & DOWN to change|BPM and press SPACE|to end recording"
  Registrazione.b=EZRequest("AmySequencer message",Messaggio$,"OK|Cancel")
  If Registrazione=0 Then Statement Return
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
  EndIf
  Battito.b=Misure
  TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
  Tempo.l=0
  Repeat

   EventoRegistratoreEventiMusicali.l=Event

   Select EventoRegistratoreEventiMusicali
   Case #HaiChiusoLaFinestra
    FineRegistrazione.b=True
   Case #HaiAttivatoIlMenu
    If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
     If MenuHit=1 AND ItemHit=2 Then FineRegistrazione=True
    EndIf
   Case #HaiPremutoUnTasto
    TastoPremuto$=LCase$(Inkey$)
    Select TastoPremuto$
    Case TastoFuga$
     FineRegistrazione=True
    Case TastoCursoreSu$
     If BattutePerMinuto<300
      BattutePerMinuto+1
      TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
      MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
     EndIf
    Case TastoCursoreGiu$
     If BattutePerMinuto>10
      BattutePerMinuto-1
      TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
      MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
     EndIf
    Case Spazio$
     FineRegistrazione=True
    End Select
   End Select
   FlushEvents

   ByteDiStato.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   TipoDiEventoMusicale.b=ByteDiStato & #_StatusBits
   CanaleEvento.b=ConvertiOltreCentoventisetteInNegativo{ByteDiStato & #_ChannelBits}+1
   Select TipoDiEventoMusicale
   Case #_NoteOn
    TipoDiEventoMusicale$="Note"
    Evento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_NoteOff
    TipoDiEventoMusicale$="NoteOff"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ProgramChange
    TipoDiEventoMusicale$="Program"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ControlChange
    TipoDiEventoMusicale$="Control"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_PolyphonicKeyPressure
    TipoDiEventoMusicale$="PolyAftertouch"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ChannelKeyPressure
    TipoDiEventoMusicale$="MonoAftertouch"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_PitchBend
    TipoDiEventoMusicale$="PitchBend"
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Default
    TipoDiEventoMusicale$=""
   End Select
   If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
    If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
     If TipoDiEventoMusicale$<>"NoteOff"
      LastItem EventoMusicale()
      If AddItem(EventoMusicale())=True
       EventoMusicale()\Tipo=TipoDiEventoMusicale$
       EventoMusicale()\Evento=Evento
       EventoMusicale()\Inizio=Tempo
       EventoMusicale()\Canale=CanaleEvento
       EventoMusicale()\Sequenza=SequenzaSelezionata
       EventoMusicale()\Durata=2
       If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Valore=ValoreEvento
       If TipoDiEventoMusicale$="Control" Then EventoMusicale()\Valore=ValoreEvento
       If TipoDiEventoMusicale$="PitchBend" Then EventoMusicale()\Valore=ValoreEvento
       Select TipoDiEventoMusicale$
       Case "Note"
        Nota.b=EventoMusicale()\Evento
        SuonaLaNota{Nota,ValoreEvento,CanaleEvento,Modo}
       Case "Program"
        Programma.b=EventoMusicale()\Evento
        EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
       Case "Control"
        Controllo.b=EventoMusicale()\Evento:ValoreEvento=EventoMusicale()\Valore
        EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
       Case "PolyAftertouch"
        PressioneMultipla.b=EventoMusicale()\Evento
        EseguiLaPressioneMultipla{PressioneMultipla,CanaleEvento,Modo}
       Case "MonoAftertouch"
        PressioneSingola.b=EventoMusicale()\Evento
        EseguiLaPressioneSingola{PressioneSingola,CanaleEvento,Modo}
       Case "PitchBend"
        CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
        EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEvento,Modo}
       End Select
       EventoMusicale()\Stato | #EventoMusicaleEseguito
       If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
        Sequenza()\EventiMusicali+1
       EndIf
       If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
        EventiMusicali+1:MostraIlTitoloDellaFinestraDellEditoreSequenza{}
       EndIf
      Else
       EZRequest "AmySequencer message","You have used all the available events","OK"
       Statement Return
      EndIf
     Else
      SmettiDiSuonareLaNota{Evento,ValoreEvento,CanaleEvento,Modo}
      EventoMusicale()\Stato & %11110111
      EventoMusicale()\Stato | #EventoMusicaleTerminato
     EndIf
    EndIf
   EndIf
   VWait
   Tempo+TicPerCinquantesimoDiSecondo
   If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
    Sequenza()\Durata=Tempo-SequenzaNellaTraccia()\Inizio+1
   EndIf
   If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
    If Tempo-XInizioAreaVisibile>FineTempoVisibile
     XInizioAreaVisibile=Tempo
     MostraLeNoteDiSfondoConILoroNomi{}
     MostraLeBattute{}
     MostraSliderEditoreSequenza{}
    EndIf
    Sequenza()\Durata=Tempo+1
    DurataSequenza=Tempo+1
   EndIf
   TempoMetronomo.w+TicPerCinquantesimoDiSecondo
   If TempoMetronomo>=(#TicDiBasePerQuarto*1.0*Battiti)/Misure
    If NotaMetronomoSuonata.b=True
     SmettiDiSuonareLaNota{76,0,10,Modo}
     TempoMetronomo=0
     NotaMetronomoSuonata=False
    Else
     SuonaLaNota{76,(127.0*Battito)/Misure,10,Modo}
     Battito-1:If Battito=0 Then Battito=Misure
     NotaMetronomoSuonata=True
    EndIf
   EndIf
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    TipoDiEventoMusicale$=EventoMusicale()\Tipo
    Evento=EventoMusicale()\Evento
    ValoreEvento=EventoMusicale()\Valore
    InizioEvento.l=EventoMusicale()\Inizio
    DurataEvento.l=EventoMusicale()\Durata
    CanaleEvento=EventoMusicale()\Canale
    StatoEvento.b=EventoMusicale()\Stato
    EventoMusicaleEseguito.b=StatoEvento & #EventoMusicaleEseguito
    If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
     If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
      If EventoMusicaleEseguito=#EventoMusicaleEseguito
       If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Durata=Tempo-InizioEvento+1
       If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
        If TipoDiEventoMusicale$="PitchBend"
         CurvaDiPicco.w=Evento*128+ValoreEvento
      DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
        Else
         DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
        EndIf
       EndIf
       If InizioEvento+DurataEvento-1>=Tempo
        EventoMusicale()\Stato & %11110111
        EventoMusicale()\Stato | #EventoMusicaleTerminato
       EndIf
      EndIf
      EventoMusicaleTerminato.b=StatoEvento & #EventoMusicaleTerminato
      If EventoMusicaleTerminato=#EventoMusicaleTerminato
       If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
        If TipoDiEventoMusicale$="PitchBend"
         CurvaDiPicco=Evento*128+ValoreEvento
         DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
        Else
         DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
        EndIf
       EndIf
       EventoMusicale()\Stato & %11101111
      EndIf
     EndIf
    EndIf
   Wend
  Until FineRegistrazione=True
  If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
   Sequenza()\Durata=Tempo-SequenzaNellaTraccia()\Inizio+1
  EndIf
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   DurataSequenza=Tempo+1
  EndIf
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   EventoMusicale()\Stato & %11100111
  Wend
 Else
  EZRequest "AmySequencer message","You must select a sequence first","OK"
 EndIf
End Statement

;-----------------------------------------------
;questa procedura mostra il punto d'inserimento
;this procedure shows the insertion point
;-----------------------------------------
Statement MostraIlPuntoDInserimento{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED CanaleSelezionato
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
 I.w=16+(PuntoDInserimento-XInizioAreaVisibile)/ScalaEventiMusicali
 If I>=16 AND I+7<LarghezzaInternaFinestraEditoreSequenza
  If CanaleSelezionato>0
   ColoreTestoPuntoDInserimento=CanaleSelezionato-1
   ColoreSfondoPuntoDInserimento=16-CanaleSelezionato
  Else
   ColoreTestoPuntoDInserimento=3
  EndIf
  WBox I,0,I+7,AltezzaInternaFinestraEditoreSequenza-8-8,ColoreSfondoPuntoDInserimento
  TestoPuntoDInserimento$="Insertion point>"
  For TestoPuntoDInserimento.b=0 To 15
   WLocate I,TestoPuntoDInserimento*8
   WColour ColoreTestoPuntoDInserimento,ColoreSfondoPuntoDInserimento
   Print Mid$(TestoPuntoDInserimento$,TestoPuntoDInserimento+1,1)
  Next TestoPuntoDInserimento
 EndIf
End Statement

;-------------------------------------------------------------------
;questa procedura mostra il pulsante del canale selezionato da solo
;this procedure shows the button of the selected channel alone
;--------------------------------------------------------------
Statement MostraPulsanteSelezioneSoloEventiMusicaliDelCanaleSelezionato{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED CanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
 If CanaleSelezionato>0
  If MostraSoloGliEventiMusicaliDelCanaleSelezionato=True Then WColour 3,2 Else WColour 2,1
 Else
  WColour 1,0
 EndIf
 WLocate 16*16,AltezzaInternaFinestraEditoreSequenza-8:Print "Alone"
End Statement

;--------------------------------------------
;questa procedura esegue gli eventi musicali
;this procedure executes the musical events
;-------------------------------------------
Statement EseguiGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED BattutePerMinuto
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaNellaTraccia()
SHARED SequenzaSelezionata
SHARED Spazio$
SHARED TastoFuga$
SHARED TipoDiEventoMusicaleDiBase$
SHARED XInizioAreaVisibile
 TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
 Tempo.l=0
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  FineEsecuzione.l=FineMotivo
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  FineEsecuzione=DurataSequenza
  FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
 EndIf
 Repeat
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   SequenzaEventoMusicale.l=EventoMusicale()\Sequenza
   If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
    ResetList Sequenza()
    SequenzaCorrente.l=0
    While NextItem(Sequenza())=True
     SequenzaCorrente+1
     If SequenzaCorrente=SequenzaEventoMusicale
      ResetList SequenzaNellaTraccia()
      While NextItem(SequenzaNellaTraccia())=True
       If SequenzaNellaTraccia()\Sequenza=SequenzaCorrente AND InizioSequenzaNellaTraccia.l>=Tempo
        InizioSequenzaNellaTraccia=Min(InizioSequenzaNellaTraccia,SequenzaNellaTraccia()\Inizio)
       EndIf
      Wend
      Pop If:Pop While:Goto FineCicloRicercaSequenzaDaSuonare
     EndIf
    Wend
   EndIf
FineCicloRicercaSequenzaDaSuonare
   If SequenzaEventoMusicale=SequenzaSelezionata OR Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
    If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
     InizioEventoMusicale.l=InizioSequenzaNellaTraccia+EventoMusicale()\Inizio
    EndIf
    If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
     InizioEventoMusicale=EventoMusicale()\Inizio
    EndIf
    TipoDiEventoMusicale$=EventoMusicale()\Tipo
    DurataEventoMusicale.l=EventoMusicale()\Durata
    FineEventoMusicale.l=InizioEventoMusicale+DurataEventoMusicale-1
    ValoreEventoMusicale.b=EventoMusicale()\Valore
    CanaleEventoMusicale.b=EventoMusicale()\Canale
    EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
    EventoMusicaleTerminato.b=EventoMusicale()\Stato & #EventoMusicaleTerminato
    If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
     If CanaleEventoMusicale=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
      If EventoMusicaleEseguito=0 AND EventoMusicaleTerminato=0 AND InizioEventoMusicale.l<=Tempo
       If TipoDiEventoMusicale$<>""
        Select TipoDiEventoMusicale$
        Case "Note"
         Nota.b=EventoMusicale()\Evento
         VelocitaNota.b=ValoreEventoMusicale
         SuonaLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
        Case "Program"
         Programma.b=EventoMusicale()\Evento
         EseguiIlCambioDiProgramma{Programma,CanaleEventoMusicale,Modo}
        Case "Control"
         Controllo.b=EventoMusicale()\Evento
         ValoreConttrollo.b=ValoreEventoMusicale
         EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleEventoMusicale,Modo}
        Case "PolyAftertouch"
         PressioneMultipla.b=EventoMusicale()\Evento
         EseguiLaPressioneMultipla{PressionMultipla,CanaleEventoMusicale,Modo}
        Case "MonoAftertouch"
         PressioneSingola.b=EventoMusicale()\Evento
         EseguiLaPressioneSingola{PressioneSingola,CanaleEventoMusicale,Modo}
        Case "PitchBend"
         CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
         EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEventoMusicale,Modo}
        Case "Tempo"
         NuovoTempo.b=EventoMusicale()\Evento
         MostraIlTempo{NuovoTempo,CanaleEventoMusicale,Modo}
        Case "BPM"
         NuoveBattutePerMinuto.w=9+EventoMusicale()\Evento*3+EventoMusicale()\Valore
         TicPerCinquantesimoDiSecondo=(NuoveBattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
         MostraLeBattutePerMinuto{NuoveBattutePerMinuto,CanaleEventoMusicale,Modo}
        End Select
        If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
         Evento.b=EventoMusicale()\Evento
         ValoreEvento.b=ValoreEventoMusicale
         InizioEvento.l=InizioEventoMusicale
         DurataEvento.l=DurataEventoMusicale
         CanaleEvento.b=CanaleEventoMusicale
         If TipoDiEventoMusicale$="PitchBend"
          DisegnaUnEventoMusicale{"PitchBend",CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
         Else
          If TipoDiEventoMusicale$="BPM"
           DisegnaUnEventoMusicale{"BPM",9+Evento*3+ValoreEvento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
          Else
           DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
          EndIf
         EndIf
        EndIf
        EventoMusicale()\Stato | #EventoMusicaleEseguito
       EndIf
      EndIf
      If EventoMusicaleEseguito=#EventoMusicaleEseguito AND EventoMusicaleTerminato=0 AND FineEventoMusicale<=Tempo
       If TipoDiEventoMusicale$<>""
        If TipoDiEventoMusicale$="Note"
         Nota=EventoMusicale()\Evento
         VelocitaNota=ValoreEventoMusicale
         SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
        EndIf
        If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
         Evento=EventoMusicale()\Evento
         ValoreEvento=ValoreEventoMusicale
         InizioEvento=InizioEventoMusicale
         DurataEvento=DurataEventoMusicale
         CanaleEvento=CanaleEventoMusicale
         StatoOriginaleEvento.b=EventoMusicale()\Stato & %11110111
         If TipoDiEventoMusicale$="PitchBend"
          DisegnaUnEventoMusicale{"PitchBend",CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
         Else
          If TipoDiEventoMusicale$="BPM"
           DisegnaUnEventoMusicale{"BPM",9+Evento*3+ValoreEvento,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
          Else
           DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
          EndIf
         EndIf
        EndIf
        EventoMusicale()\Stato | #EventoMusicaleTerminato
       EndIf
      EndIf
     EndIf
    EndIf
   EndIf
  Wend

  VWait

  Tempo+TicPerCinquantesimoDiSecondo

  If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
   WJam #DueColoriConSfondoPieno
   WLocate 0,0:WColour 0,0:Print SPACE$(80)
   WLocate 0,0:WColour 3:Print "Playing song, now at ":ConvertiIlTempoInBattute{Tempo,1}:Print "..."
   WJam #UnColoreConSfondoTrasparente
  EndIf

  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   If Tempo-XInizioAreaVisibile>FineTempoVisibile
    XInizioAreaVisibile=Tempo
    MostraLeNoteDiSfondoConILoroNomi{}
    MostraLeBattute{}
    MostraGliEventiMusicali{}
    MostraSliderEditoreSequenza{}
   EndIf
  EndIf

  EventoEsecutoreEventiMusicali.l=Event

  Select EventoEsecutoreEventiMusicali
  Case #HaiChiusoLaFinestra
   Pop Select:Pop Repeat:Goto FineCicloEsecuzioneEventiMusicali
  Case #HaiAttivatoIlMenu
   Select Modo
   Case #EseguiGliEventiMusicaliDallaFinestraPrincipale
    If MenuHit=1 AND ItemHit=2 Then Pop Select:Pop Select:Pop Repeat:Goto FineCicloEsecuzioneEventiMusicali
   Case #EseguiGliEventiMusicaliDallEditoreSequenza
    If MenuHit=0 AND ItemHit=2 Then Pop Select:Pop Select:Pop Repeat:Goto FineCicloEsecuzioneEventiMusicali
   End Select
  Case #HaiRilasciatoUnBottone
   If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale AND GadgetHit=1
    LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
    BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
    TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
    MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
   EndIf
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoFuga$
    Pop Select:Pop Select:Pop Repeat:Goto FineCicloEsecuzioneEventiMusicali
   Case Spazio$
    Pop Select:Pop Select:Pop Repeat:Goto FineCicloEsecuzioneEventiMusicali
   End Select
  End Select
  FlushEvents
 Until Tempo>=FineEsecuzione

FineCicloEsecuzioneEventiMusicali

 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
  If EventoMusicaleEseguito=#EventoMusicaleEseguito
   If EventoMusicale()\Tipo="Note"
    Nota=EventoMusicale()\Evento
    VelocitaNota=EventoMusicale()\Valore
    CanaleNota.b=EventoMusicale()\Canale
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,Modo}
   EndIf
   EventoMusicale()\Stato & %11100111
  EndIf
 Wend
 Quiet %1111
End Statement

;-------------------------------------------------------------
;questa procedura permette di editare la sequenza selezionata
;this procedure permits to edit the selected sequence
;-----------------------------------------------------
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED Misure
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraNuovoValore
SHARED NotaSuonata
SHARED NoteSuonate
SHARED OttavaSelezionata
SHARED PeriFreq()
SHARED PrimaVoltaNellEditoreSequenza
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaNellaTraccia()
SHARED Spazio$
SHARED TastoDelTopoCliccato
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoFuga$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEventoMusicaleDiBase$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#BottoneNascondiFinestra+#BottoneChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 DurataSequenza=Max(Sequenza()\Durata,(#TicDiBasePerQuarto*4.0*Battiti)/Misure)
 EventiMusicali=Sequenza()\EventiMusicali
 EventiMusicaliSelezionati=Sequenza()\EventiMusicaliSelezionati
 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
 MostraIlTitoloDellaFinestraDellEditoreSequenza{}
 LarghezzaInternaFinestraEditoreSequenza=InnerWidth
 AltezzaInternaFinestraEditoreSequenza=InnerHeight
 CloseWindow #FinestraEditoreSequenza

 AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8

 AreaVisibileDeiValori=(128-AreaInvisibileDelleNote)*8-7

 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
 ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}

 XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
 YLunSlider=8
 ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}

 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetEditoreSequenza
 MostraIlTitoloDellaFinestraDellEditoreSequenza{}

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

 SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8

 MostraLaScalaDegliEventiMusicali{False}
 SetZone 1,0,AltezzaInternaFinestraEditoreSequenza-8-8,7,AltezzaInternaFinestraEditoreSequenza-8-8+7
 SetZone 2,8,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7

 Format "00"
 For Canale.b=1 To 16
  X0Canale.w=(Canale-1)*16:Y0Canale.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate X0Canale,Y0Canale
  If Canale=CanaleSelezionato
   WColour Canale-1,16-Canale
  Else
   If ColoriOriginali=True
    WColour Canale MOD 2+1,Canale MOD 2
   Else
    WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
   EndIf
  EndIf
  Print Canale
  SetZone Canale+2,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
 Next Canale
 Format ""
 SetZone Canale+2,X0Canale+16,Y0Canale,#LarghezzaPulsantiEditoreSequenza-1,Y0Canale+7
 MostraPulsanteSelezioneSoloEventiMusicaliDelCanaleSelezionato{}
 WLocate X0Canale+16,Y0Canale:Print "Alone"
; WLocate X0Canale+16,Y0Canale
; If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
; Print "All":SetZone 19,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
; WLocate X0Canale+16+8*3,Y0Canale
; If ColoriOriginali=True Then WColour 1,0 Else WColour 15,14
; Print "None":SetZone 20,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
; WLocate X0Canale+16+8*3+8*4,Y0Canale
; If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
; Print "Toggle":SetZone 21,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
 If PrimaVoltaNellEditoreSequenza=True

;--------------------------------------------------------------------------
;questa variabile indica la nota d'inizio delle note nell'editore sequenza
;this variable states the beginning note in the sequence editor
;---------------------------------------------------------------
  YInizioAreaVisibile=127-(127-AreaInvisibileDelleNote)-#_MiddleC
 EndIf

 Repeat
  If SecondoClicDelTopo.b=False
   AreaInvisibileDelTempo=DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
   AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
   MostraSliderEditoreSequenza{}
   ImpostaMenuEditoreSequenza{}
   MostraIlTitoloDellaFinestraDellEditoreSequenza{}
   MostraLeNoteDiSfondoConILoroNomi{}
   MostraLeBattute{}
   MostraGliEventiMusicali{}
   MostraIlPuntoDInserimento{}
   MostraPulsanteSelezioneSoloEventiMusicaliDelCanaleSelezionato{}
   SecondoClicDelTopo=True
  EndIf
  If PrimaVoltaNellEditoreSequenza=True
   MostraITastiDaUsare{}
   MostraLaMappaturaDelleNoteSullaTastiera{}
   PrimaVoltaNellEditoreSequenza=False
  EndIf
  If NotaSuonata\Stato=True
   Nota.b=NotaSuonata\Evento:FineNota.l=NotaSuonata\Durata-1
   VelocitaNota.b=NotaSuonata\Valore:CanaleNota.b=NotaSuonata\Canale
   DurataNota.l=(Timer-TempoTrascorso.l)*TicPerCinquantesimoDiSecondo
   If DurataNota>FineNota
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
    NotaSuonata\Stato=False
   EndIf
  EndIf
  If NoteSuonate>0 AND NotaSuonata\Stato=False
   If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
   Messaggio$+" still playing:|clicking on OK you will stop "
   If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
   EZRequest "AmySequencer message",Messaggio$,"OK"
   InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallEditoreSequenza}
   NoteSuonate=0
  EndIf

  EventoFinestraEditoreSequenza.l=Event

  Select EventoFinestraEditoreSequenza
  Case #HaiPremutoUnTastoDelTopo
   XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato=MButtons
   ZonaTopo.b=Zone(XTopo,YTopo)
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    Select ZonaTopo
    Case 0
     Selezione{#SelezionaUnEventoMusicale}
    Case 1
     ScalaEventiMusicali/2:If ScalaEventiMusicali=0 Then ScalaEventiMusicali=64
     MostraLaScalaDegliEventiMusicali{True}
    Case 2
     ScalaEventiMusicali+ScalaEventiMusicali:If ScalaEventiMusicali=128 Then ScalaEventiMusicali=1
     MostraLaScalaDegliEventiMusicali{True}
    Case 3
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 4
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 5
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 6
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 7
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 8
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 9
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 10
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 11
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 12
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 13
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 14
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 15
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 16
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 17
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 18
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 19
     If CanaleSelezionato>0
      MostraSoloGliEventiMusicaliDelCanaleSelezionato=NOT MostraSoloGliEventiMusicaliDelCanaleSelezionato
     EndIf
    End Select
    TempoTrascorso.l=Timer
    SecondoClicDelTopo=False
   Case #TastoSinistroDelTopoRilasciato
    If Timer-TempoTrascorso>49 AND ZonaTopo=0
     Selezione{#SelezionaGliEventiMusicaliUguali}
     SecondoClicDelTopo=False
    Else
     SecondoClicDelTopo=True
    EndIf
   End Select
;  Case #HaiPremutoUnBottone
;   Select GadgetHit
;   Case 1
;    AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
;    YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
;   Case 2
;    LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
;    XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
;    XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
;   End Select
  Case #HaiRilasciatoUnBottone
   Select GadgetHit
   Case 1
    AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
    YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
   Case 2
    LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
    XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
    XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
   End Select
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   Menu.b=MenuHit:Voce.b=ItemHit
   Select Menu
   Case 0
    Select Voce
    Case 0
     PushItem Sequenza()
     PushItem SequenzaNellaTraccia()
     PushItem EventoMusicale()
     InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallEditoreSequenza}
     EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}
     InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallEditoreSequenza}
     PopItem EventoMusicale()
     PopItem SequenzaNellaTraccia()
     PopItem Sequenza()
    Case 1
     RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}
    End Select
   Case 1
    Select Voce
    Case 0
     Selezione{#SelezionaTuttiGliEventiMusicali}
    Case 1
     Selezione{#DeselezionaTuttiGliEventiMusicali}
    Case 2
     Selezione{#InvertiLaSelezioneDiTuttiGliEventiMusicali}
    Case 3
     Selezione{#TagliaGliEventiMusicaliSelezionati}
    Case 4
     Selezione{#CopiaGliEventiMusicaliSelezionati}
    Case 5
     Selezione{#IncollaGliEventiMusicali}
    Case 6
     Selezione{#DimenticaGliEventiMusicaliTagliatiOCopiati}
    Case 7
     XInizioAreaVisibile=PuntoDInserimento
    End Select
   Case 2
    Select Voce
    Case 0
     TipoDiEventoMusicaleDiBase$="Note"
    Case 1
     TipoDiEventoMusicaleDiBase$="Program"
    Case 2
     TipoDiEventoMusicaleDiBase$="Control"
    Case 3
     TipoDiEventoMusicaleDiBase$="PolyAftertouch"
    Case 4
     TipoDiEventoMusicaleDiBase$="MonoAftertouch"
    Case 5
     TipoDiEventoMusicaleDiBase$="PitchBend"
    Case 6
     TipoDiEventoMusicaleDiBase$="Tempo"
    Case 7
     TipoDiEventoMusicaleDiBase$="BPM"
    Case 8
     MostraSoloGliEventiMusicaliDelloStessoTipo=NOT MostraSoloGliEventiMusicaliDelloStessoTipo
    End Select
   Case 3
    Select Voce
    Case 0
     CambiaLEventoBase{}
    Case 1
     MostraNuovoValore=NOT MostraNuovoValore
    End Select
   Case 4
    Select Voce
    Case 0
     MostraITastiDaUsare{}
    Case 1
     MostraLaMappaturaDelleNoteSullaTastiera{}
    End Select
   End Select
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDallEditoreSequenza.b=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$):TastoRiga.w=RawKey
   If TastoPremuto$=TastoFuga$ Then EsciDallEditoreSequenza=True
   Select TastoRiga
   Case 2
    Nota$="C#2"
   Case 3
    Nota$="D#2"
   Case 5
    Nota$="F#2"
   Case 6
    Nota$="G#2"
   Case 7
    Nota$="A#2"
   Case 16
    Nota$="C2"
   Case 17
    Nota$="D2"
   Case 18
    Nota$="E2"
   Case 19
    Nota$="F2"
   Case 20
    Nota$="G2"
   Case 21
    Nota$="A2"
   Case 22
    Nota$="B2"
   Case 33
    Nota$="C#1"
   Case 34
    Nota$="D#1"
   Case 36
    Nota$="F#1"
   Case 37
    Nota$="G#1"
   Case 38
    Nota$="A#1"
   Case 49
    Nota$="C1"
   Case 50
    Nota$="D1"
   Case 51
    Nota$="E1"
   Case 52
    Nota$="F1"
   Case 53
    Nota$="G1"
   Case 54
    Nota$="A1"
   Case 55
    Nota$="B1"
   Case 80
    OttavaSelezionata=0
   Case 81
    OttavaSelezionata=1
   Case 82
    OttavaSelezionata=2
   Case 83
    OttavaSelezionata=3
   Case 84
    OttavaSelezionata=4
   Case 85
    OttavaSelezionata=5
   Case 86
    OttavaSelezionata=6
   Case 87
    OttavaSelezionata=7
   Case 88
    OttavaSelezionata=8
   Case 89
    OttavaSelezionata=9
   Default
    TastoRiga=0
   End Select
   If TastoRiga>0
    If TastoRiga<80
     AggiungiUnaNotaDallaTastiera{Nota$}
    Else
     YInizioAreaVisibile=Max(127-(127-AreaInvisibileDelleNote)-OttavaSelezionata*12,0)
    EndIf
   EndIf
   TastiShiftPremuti.b=(Qualifier-$8000) & %11
   If EventiMusicaliSelezionati>0
    If TastiShiftPremuti>0
     Select TastoPremuto$
     Case TastoBackspace$
      Selezione{#EliminaGliEventiMusicaliSelezionati}
     Case TastoCursoreSu$
      If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
      If TipoDiEventoMusicaleDiBase$="Program" Then Selezione{#AggiungiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="Control" Then Selezione{#AggiungiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="PolyAftertouch" Then Selezione{#AggiungiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="MonoAftertouch" Then Selezione{#AggiungiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="Tempo" Then Selezione{#AggiungiUnaMisuraAlTempoSelezionato}
      If TipoDiEventoMusicaleDiBase$="BPM" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
     Case TastoCursoreGiu$
      If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
      If TipoDiEventoMusicaleDiBase$="Program" Then Selezione{#SottraiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="Control" Then Selezione{#SottraiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="PolyAftertouch" Then Selezione{#SottraiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="MonoAftertouch" Then Selezione{#SottraiOttoAgliEventiMusicaliSelezionati}
      If TipoDiEventoMusicaleDiBase$="Tempo" Then Selezione{#TogliUnaMisuraAlTempoSelezionato}
      If TipoDiEventoMusicaleDiBase$="BPM" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
     Case TastoCursoreDestra$
      If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
     Case TastoCursoreSinistra$
      If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
     End Select
    Else
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreSu$
      If TipoDiEventoMusicaleDiBase$="Tempo"
       Selezione{#AggiungiUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AlzaDiUnoGliEventiMusicaliSelezionati}
      EndIf
     Case TastoCursoreGiu$
      If TipoDiEventoMusicaleDiBase$="Tempo"
       Selezione{#TogliUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AbbassaDiUnoGliEventiMusicaliSelezionati}
      EndIf
     Case TastoCursoreDestra$
      Selezione{#SpostaAvantiNelTempoGliEventiMusicaliSelezionati}
     Case TastoCursoreSinistra$
      Selezione{#SpostaIndietroNelTempoGliEventiMusicaliSelezionati}
     End Select
    EndIf
   Else
    If TastiShiftPremuti>0
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreDestra$
      PuntoDInserimento+LarghezzaEventoBase
      PuntoDInserimento=Min(PuntoDInserimento,DurataSequenza)
     Case TastoCursoreSinistra$
      PuntoDInserimento-LarghezzaEventoBase
      PuntoDInserimento=Max(PuntoDInserimento,0)
     End Select
    Else
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreSu$
      If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
     Case TastoCursoreGiu$
      If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
     Case TastoCursoreDestra$
      XInizioAreaVisibile+LarghezzaEventoBase
      XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
     Case TastoCursoreSinistra$
      XInizioAreaVisibile-LarghezzaEventoBase
      XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
     End Select
    EndIf
   EndIf
   If TastoPremuto$=Spazio$
    ResetList EventoMusicale()
    While NextItem(EventoMusicale())
     If EventoMusicale()\Inizio>=PuntoDInserimento
      EventoMusicale()\Inizio+LarghezzaEventoBase
     EndIf
    Wend
    PuntoDInserimento+LarghezzaEventoBase
    DurataSequenza+LarghezzaEventoBase
   EndIf
   SecondoClicDelTopo=False
  End Select
  FlushEvents
 Until EsciDallEditoreSequenza=True
 Sequenza()\EventiMusicali=EventiMusicali
 Sequenza()\EventiMusicaliSelezionati=EventiMusicaliSelezionati
 Sequenza()\Durata=Max(DurataSequenza,(#TicDiBasePerQuarto*4.0*Battiti)/Misure)
 MostraSoloGliEventiMusicaliDelloStessoTipo=False
 MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
 CloseWindow #FinestraEditoreSequenza
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;------------------------------------------------------------------------------
;questa procedura elimina tutti gli eventi musicali della sequenza selezionata
;this procedure deletes all the events of the selected  sequence
;-----------------------------------------------------------------
Statement EliminaTuttiGliEventiMusicaliDellaSequenza{}
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED Sequenza()
SHARED SequenzaSelezionata
 If Sequenza()\EventiMusicali>0
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato
     Sequenza()\EventiMusicaliSelezionati-1
    EndIf
    EventoMusicale()\Tipo="",0,0,0,0,0,0,0:KillItem EventoMusicale()
    Sequenza()\EventiMusicali-1
   EndIf
  Wend
 EndIf
 DurataSequenza=0
 EventiMusicali=0
 EventiMusicaliSelezionati=0
End Statement

;-----------------------------------------------------------
;questa procedura cambia il nome della sequenza selezionata
;this procedure change the selected sequence's name
;---------------------------------------------------
Statement CambiaIlNomeDellaSequenzaSelezionata{}
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED Spazio$
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the new name for the sequence>"
 NomeDiBaseDellaSequenzaSelezionata$="Sequence"+Spazio$+Str$(SequenzaSelezionata)
 NuovoNomeDellaSequenzaSelezionata$=Edit$(NomeDiBaseDellaSequenzaSelezionata$,80-Len(NomeDiBaseDellaSequenzaSelezionata$))
 NuovoNomeDellaSequenzaSelezionata$=StripLead$(StripTrail$(NuovoNomeDellaSequenzaSelezionata$,Asc(Spazio$)),Asc(Spazio$))
 If NuovoNomeDellaSequenzaSelezionata$<>"" Then Sequenza()\Nome=NuovoNomeDellaSequenzaSelezionata$
 WJam #UnColoreConSfondoTrasparente
End Statement

;--------------------------------------------------------
;questa procedura mostra gli eventi musicali disponibili
;this procedure shows the available musical events
;--------------------------------------------------
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED SequenzaEsistente()
SHARED SequenzaNellaTraccia()
SHARED TotaleEventiMusicali
 Sequenze.l=0
 TotaleEventiMusicali=0
 ResetList SequenzaNellaTraccia()
 While NextItem(SequenzaNellaTraccia())=True
  Sequenza=SequenzaNellaTraccia()\Sequenza
  If Sequenza>0
   If SequenzaNellaTraccia()\Genitore=True
    ResetList Sequenza()
    SequenzaCorrente.l=0
    While NextItem(Sequenza())=True
     SequenzaCorrente+1
     If SequenzaCorrente=Sequenza AND Sequenza()\Durata>0
      TotaleEventiMusicali+Sequenza()\EventiMusicali
      Sequenze+1
     EndIf
    Wend
    SequenzaEsistente(Sequenza-1)=True
   EndIf
  EndIf
 Wend
 WLocate 0,0:WColour 3,0:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
 If TotaleEventiMusicali<>1 Then Print "s"
 Print " used, "
 If Sequenze>0
  Print Str$(Sequenze)," sequence":If Sequenze>1 Then Print "s"
 Else
  Print "no sequences"
 EndIf
End Statement

;---------------------------------------------
;questa procedura mostra la sequenza indicata
;this procedure shows the stated sequence
;-----------------------------------------
Statement MostraSequenza{Sequenza.l,InizioSequenza.l,DurataSequenza.l,TracciaSequenza.w,ModoDisegno.b}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza()
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
 Y0.w=(TracciaSequenza-YTracceVisibili)*8:Y1.w=Y0+7
 If Y0>=8 AND Y1<8+TracceVisibili*8
  FineSequenza.l=InizioSequenza+DurataSequenza-1
  I.w=16+InizioSequenza-XTracceVisibili
  F.w=16+FineSequenza-XTracceVisibili
  If I>=16 AND I<LarghezzaInternaFinestraPrincipale
   InizioSequenzaVisibile.b=True
  Else
   InizioSequenzaVisibile=False
  EndIf
  If F>=16 AND F<LarghezzaInternaFinestraPrincipale
   FineSequenzaVisibile.b=True
  Else
   FineSequenzaVisibile=False
  EndIf
  If I<16 AND F>LarghezzaInternaFinestraPrincipale
   SequenzaVisibile.b=True
  Else
   If InizioSequenzaVisibile=True OR FineSequenzaVisibile=True
    SequenzaVisibile=True
   Else
    SequenzaVisibile=False
   EndIf
  EndIf
  If SequenzaVisibile=True
   X0Sequenza.w=Min(Max(I,16),LarghezzaInternaFinestraPrincipale-1)
   Y0Sequenza.w=Min(Max(Y0,8),AltezzaInternaFinestraPrincipale-1-8-8-4-7)
   X1Sequenza.w=Min(Max(F,16),LarghezzaInternaFinestraPrincipale-1)
   Y1Sequenza.w=Min(Max(Y1,8+7),AltezzaInternaFinestraPrincipale-1-8-8-4)
   ColoreSequenza.b=(Sequenza-1) MOD 16
   WBox X0Sequenza,Y0Sequenza,X1Sequenza,Y1Sequenza,ColoreSequenza
   If ModoDisegno=#SequenzaSelezionata
    Wline X0Sequenza,Y0,X1Sequenza,Y1,15-ColoreSequenza
    Wline X0Sequenza,Y1,X1Sequenza,Y0,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    Wline X0Sequenza+1,Y0Sequenza+1,X1Sequenza-1,Y0Sequenza+1,15-ColoreSequenza
    Wline X0Sequenza+1,Y1Sequenza-1,X1Sequenza-1,Y1Sequenza-1,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    If InizioSequenzaVisibile=True
     Wline I+1,Y0Sequenza+1,I+1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
    If FineSequenzaVisibile=True
     Wline F-1,Y0Sequenza+1,F-1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
   EndIf
   NomeSequenza$=Sequenza()\Nome
   If NomeSequenza$="" Then NomeSequenza$="Sequence "+Str$(Sequenza)
   If I>=16 OR I<LarghezzaInternaFinestraPrincipale OR F>=16 OR F<LarghezzaInternaFinestraPrincipale
    WColour 15-ColoreSequenza,ColoreSequenza
    I=Max(I,16):F=Min(F,LarghezzaInternaFinestraPrincipale-1)
    WLocate I,Y0Sequenza:Print Left$(NomeSequenza$,(F-I+1)/8)
   EndIf
  EndIf
 EndIf
End Statement

;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza()
SHARED SequenzaNellaTraccia()
SHARED SequenzaSelezionata
SHARED TracceVisibili
SHARED Traccia()
SHARED XTracceVisibili
SHARED YTracceVisibili
 FineMotivo=0
 For Traccia.b=1 To TracceVisibili
  If Traccia(YTracceVisibili+Traccia-1)=False
   WLocate 16,Traccia*8:WColour 3,0:Print "Track ",Str$(YTracceVisibili+Traccia)," empty"
  Else
   ResetList SequenzaNellaTraccia()
   ResetList Sequenza()
   SequenzaCorrente.l=0
   While NextItem(SequenzaNellaTraccia())=True
    InizioSequenza.l=SequenzaNellaTraccia()\Inizio
    Sequenza.l=SequenzaNellaTraccia()\Sequenza
    TracciaSequenza.w=SequenzaNellaTraccia()\Traccia
    PosizioneTraccia.b=TracciaSequenza-YTracceVisibili
    If PosizioneTraccia>=1 AND PosizioneTraccia<=TracceVisibili
     While NextItem(Sequenza())=True
      SequenzaCorrente+1
      If SequenzaCorrente=Sequenza
       DurataSequenza.l=Sequenza()\Durata
       If DurataSequenza>0
        If Sequenza=SequenzaSelezionata Then ModoDisegno.b=#SequenzaSelezionata Else ModoDisegno=#SequenzaNonSelezionata
        MostraSequenza{Sequenza,InizioSequenza,DurataSequenza,TracciaSequenza,ModoDisegno}
        FineMotivo=Max(FineMotivo,InizioSequenza+DurataSequenza)
        Pop If:Pop If:Pop While:Pop If:Goto FineCicloRicercaSequenzaDaMostrare
       EndIf
      EndIf
     Wend
    EndIf
FineCicloRicercaSequenzaDaMostrare
   Wend
  EndIf
 Next Traccia
End Statement

Statement MostraSliderFinestraPrincipale{}
SHARED AreaInvisibileDelMotivo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{1,BattutePerMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{2,YTracceVisibili,#MassimoTracce-TracceVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;-------------------------------------
;calcola l'area invisibile del motivo
;evaluate the motive's invisible area
;-------------------------------------
 AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{3,XTracceVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

End Statement

Statement CancellaTutto{}
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED Sequenza()
SHARED SequenzaEsistente()
SHARED SequenzaNellaTraccia()
SHARED SequenzaSelezionata
SHARED Suono()
SHARED Traccia()
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  EventoMusicale()\Tipo="",0,0,0,0,0,0,0:KillItem EventoMusicale()
 Wend
 ClearList EventoMusicale()
 ResetList Sequenza()
 While NextItem(Sequenza())=True
  Sequenza()\Nome="",0,0,0:KillItem Sequenza()
 Wend
 ResetList SequenzaNellaTraccia()
 While NextItem(SequenzaNellaTraccia())=True
  SequenzaNellaTraccia()\Sequenza=0,0,0,0:KillItem SequenzaNellaTraccia()
 Wend
 ClearList Sequenza()
 ClearList SequenzaNellaTraccia()
 For Traccia.w=0 To #MassimoTracce-1
  Traccia(Traccia)=False
 Next Traccia
 For SequenzaEsistente.l=0 To #MassimoSequenze-1
  SequenzaEsistente(SequenzaEsistente)=0
  Next SequenzaEsistente
  For Suono.b=0 To 31
   Suono(Suono)\Nome="",0
  Next Suono
  DurataSequenza=0
  EventiMusicali=0
  EventiMusicaliSelezionati=0
  SequenzaSelezionata=0
End Statement

;*********************************************
;fine delle procedure ed inizio del programma
;procedures end and program start
;*********************************

;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup

BlitMode CookieMode

;calculates the frequency and the AMIGA voice period for all the 128 notes
CalcolaLaFrequenzaEdIlPeriodoDelleNote{}

;loads the Topaz8 font
CaricaLaFonteDiCaratteriTopaz8{}

;sets the AMIGA speech
ImpostaIlParlatoDellAmiga{}

;loads note images for the basic event window
CaricaLeImmaginiDelleNote{}

;creates the background bitmap
CreaLaBitmapPerLImmagineDiSfondo{}

;sets the screen
ImpostaLoSchermo{}

;loads the background pic into its bitmap
CaricaLImmagineDiSfondoNellaBitmap{}

;loads the loaded LoadedMIDIFiles history
CaricaLaStoriaDeiFileMIDIAperti{}

;sets the main window
ImpostaLaFinestraPrincipale{}

;sets the main window menu
ImpostaIlMenuDellaFinestraPrincipale{}

;puts the background pic into the main window
MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;shows the main window' sliders
MostraSliderFinestraPrincipale{}

;--------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione delle
; battute per minuto
;copies into memory the measures per minute indication's on screen position
; background
;------------
 CopiaLoSfondoSottoAlleBattutePerMinuto{}

;------------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione del tempo
;copies into memory the time indication's on screen position background
;-----------------------------------------------------------------------
 CopiaLoSfondoSottoAlTempo{}

;shows the sequences
MostraLeSequenze{}

;shows the execution velocity in bars per minute
 MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}

;shows the metronomic time
 MostraIlTempo{#BattitiDiBase-1+EsponenteDiDue{#MisureDiBase}*16,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}

If ParlatoAttivato=True Then Speak "Welcome to AmySequencer!"

;activates MIDI
AttivaMIDI{}

;-----------------
;clclo principale
;main loop
;----------
Repeat

 If SecondoClicDelTopo.b=False
  MettiLImmagineDiSfondoNellaFinestraPrincipale{}
  PushItem Sequenza()
  PushItem SequenzaNellaTraccia()
  PushItem EventoMusicale()
  MostraGliEventiMusicaliDisponibili{}
  MostraLeSequenze{}
  PopItem EventoMusicale()
  PopItem SequenzaNellaTraccia()
  PopItem Sequenza()
  MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  MostraIlTempo{Battiti-1+EsponenteDiDue{Misure}*16,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  MostraSliderFinestraPrincipale{}
  SecondoClicDelTopo=True
 EndIf

 If NoteSuonate>0
  If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
  Messaggio$+" still playing:|clicking on OK you will stop "
  If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
  EZRequest "AmySequencer message",Messaggio$,"OK"
  InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  NoteSuonate=0
 EndIf

;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
 EventoFinestraPrincipale.l=WaitEvent

 Select EventoFinestraPrincipale

;------------------------------------
;se avete premuto un tasto del mouse
;if you have pressed a mouse button
;-----------------------------------
 Case #HaiPremutoUnTastoDelTopo
  XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato=MButtons
  Select TastoDelTopoCliccato
  Case #TastoSinistroDelTopoPremuto
   If YTopo>=8 AND YTopo<8+TracceVisibili*8
    TracciaSelezionata.w=YTopo/8+YTracceVisibili
    ResetList SequenzaNellaTraccia()
    SequenzaSelezionata=0
    While NextItem(SequenzaNellaTraccia())=True
     TracciaSequenza.w=SequenzaNellaTraccia()\Traccia
     If TracciaSequenza=TracciaSelezionata
      Sequenza=SequenzaNellaTraccia()\Sequenza
      InizioSequenza.l=SequenzaNellaTraccia()\Inizio
      ResetList Sequenza()
      SequenzaCorrente.l=0
      While NextItem(Sequenza())=True
       SequenzaCorrente+1
       If SequenzaCorrente=Sequenza
        DurataSequenza.l=Sequenza()\Durata
        If DurataSequenza>0
         FineSequenza.l=InizioSequenza+DurataSequenza-1
         I.w=InizioSequenza-XTracceVisibili
         F.w=FineSequenza-XTracceVisibili
         If XTopo>=I AND XTopo<=F
          SequenzaSelezionata=Sequenza
          Pop If:Pop If:Pop If:Pop While:Pop If:Pop While
          Goto FineRicercaSequenzaSelezionata
         EndIf
        EndIf
       EndIf
      Wend
     EndIf
    Wend
    For Sequenza=1 To SequenzaMassimaDaCreare
     If SequenzaEsistente(Sequenza-1)=False
      Pop If:Pop For:Goto FineRicercaSequenzaDaAggiungere
     EndIf
    Next Sequenza
FineRicercaSequenzaDaAggiungere
    LastItem Sequenza()
    LastItem SequenzaNellaTraccia()
    If AddItem(Sequenza())=True AND AddItem(SequenzaNellaTraccia())=True
     SequenzaNellaTraccia()\Sequenza=Sequenza
     SequenzaNellaTraccia()\Traccia=TracciaSelezionata
     SequenzaNellaTraccia()\Inizio=XTracceVisibili+XTopo-16
     SequenzaNellaTraccia()\Genitore=True
     Sequenza()\Durata=(#TicDiBasePerQuarto*4.0*Battiti)/Misure
     SequenzaEsistente(Sequenza-1)=True
     Traccia(TracciaSelezionata-1)=True
     If Sequenza=SequenzaMassimaDaCreare Then SequenzaMassimaDaCreare+1
    Else
     EZRequest "AmySequencer message","You have used all|the available sequences","OK"
    EndIf
FineRicercaSequenzaSelezionata
   EndIf
   If YTopo>AltezzaInternaFinestraPrincipale-1-8-8 AND YTopo<AltezzaInternaFinestraPrincipale-8
    If XTopo>LarghezzaInternaFinestraPrincipale-Len("Tempo=00/000")*8
     CambiaLaMisuraDelTempo{}
     MostraIlTempo{Battiti-1+EsponenteDiDue{Misure}*16,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #TastoSinistroDelTopoRilasciato
   SecondoClicDelTopo=True
  End Select
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
; Case #HaiPremutoUnBottone
;  Select GadgetHit
;  Case 1
;   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
;   BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;   TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
;  Case 2
;   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
;   YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
;  Case 3
;   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
;   XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;  End Select
;  SecondoClicDelTopo=False

;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
 Case #HaiRilasciatoUnBottone
  BarraDiScorrimento.b=GadgetHit
  Select BarraDiScorrimento
  Case 1
   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
   BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
   TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
  Case 2
   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
   YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,AltezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
  Case 3
   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
   XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
  End Select
  SecondoClicDelTopo=False

;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
 Case #HaiAttivatoIlMenu

  MenuScelto.b=MenuHit
  VoceScelta.b=ItemHit

  Select MenuScelto
  Case 0
   Select VoceScelta
   Case 0
    CancellaTutto{}
   Case 1
    CancellaTutto{}
    PrimoFileMIDICaricatoPrima$=FileMIDIAperto$(0)
    CaricaUnFileMIDI{""}
    CaricaLaStoriaDeiFileMIDIAperti{}
    PrimoFileMIDICaricatoDopo$=FileMIDIAperto$(0)
    If PrimoFileMIDICaricatoPrima$<>PrimoFileMIDICaricatoDopo$ Then ImpostaIlMenuDellaFinestraPrincipale{}
   End Select
   If VoceScelta>3 AND VoceScelta<VoceMenuEsci
    NomeDelFileMIDI$=FileMIDIAperto$(VoceScelta-4)
    CaricaUnFileMIDI{NomeDelFileMIDI$}
   EndIf
  Case 1
   Select VoceScelta
   Case 0
    PushItem Sequenza()
    PushItem SequenzaNellaTraccia()
    PushItem EventoMusicale()
    InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    PopItem EventoMusicale()
    PopItem SequenzaNellaTraccia()
    PopItem Sequenza()
    MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    MostraIlTempo{Battiti-1+EsponenteDiDue{Misure}*16,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
   Case 1
    RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
   End Select
  Case 2
   If SequenzaSelezionata>0
    Select VoceScelta
    Case 0
     EditoreSequenza{}
    Case 1
     CambiaIlNomeDellaSequenzaSelezionata{}
    End Select
   Else
    EZRequest "AmySequencer message","You must select a sequence first","OK"
   EndIf
  Case 3
   If VoceScelta=0 Then EditoreSuoni{}
  Case 4
   Select VoceScelta
   Case 0
    AttivaMIDI{}
   Case 1
    ColoriOriginali=NOT ColoriOriginali
    CaricaLImmagineDiSfondoNellaBitmap{}
    CopiaLoSfondoSottoAlleBattutePerMinuto{}
    CopiaLoSfondoSottoAlTempo{}
   Case 2
    If Exists("LoadedMIDIFilesHistory")
     CancellaLaStoriaDeiFileMIDIAperti{}
     ImpostaIlMenuDellaFinestraPrincipale{}
    EndIf
   End Select
  End Select

;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
  If MenuScelto=0 AND VoceScelta=VoceMenuEsci Then EsciDalProgramma=True

  SecondoClicDelTopo=False

;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
 Case #HaiPremutoUnTasto

;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable stores the key pressed
;-------------------------------------
  TastoPremuto$=LCase$(Inkey$)

  Select TastoPremuto$

;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
  Case TastoFuga$
   EsciDalProgramma=True

  Case TastoBackspace$
   If SequenzaSelezionata>0
    TracciaDellaSequenzaEliminata.w=SequenzaNellaTraccia()\Traccia
    SequenzaNellaTraccia()\Sequenza=0,0,0,0
    KillItem SequenzaNellaTraccia()
    ResetList SequenzaNellaTraccia()
    SequenzaCorrente=0
    TracciaConSequenza.b=False
    While NextItem(SequenzaNellaTraccia())=True
     If SequenzaNellaTraccia()\Sequenza=SequenzaSelezionata
      SequenzaCorrente+1
      If SequenzaCorrente=1
       SequenzaNellaTraccia()\Genitore=True
      Else
       SequenzaNellaTraccia()\Genitore=SequenzaSelezionata
      EndIf
     EndIf
     If SequenzaNellaTraccia()\Traccia=TracciaDellaSequenzaEliminata
      TracciaConSequenza=True
     EndIf
    Wend
    If SequenzaCorrente=0
     EliminaTuttiGliEventiMusicaliDellaSequenza{}
     Sequenza()\Nome="",0,0,0
     KillItem Sequenza()
     SequenzaEsistente(SequenzaSelezionata-1)=False
    EndIf
    If TracciaConSequenza=False Then Traccia(TracciaDellaSequenzaEliminata-1)=False
    If LastItem(SequenzaNellaTraccia())=True
     If SequenzaNellaTraccia()\Sequenza>SequenzaSelezionata
      SequenzaEsistente(SequenzaNellaTraccia()\Sequenza-1)=False
      Repeat
       If SequenzaNellaTraccia()\Sequenza>SequenzaSelezionata
        PushItem SequenzaNellaTraccia()
        If PrevItem(SequenzaNellaTraccia())=True
         If SequenzaNellaTraccia()\Sequenza>SequenzaSelezionata
          Sequenza=SequenzaNellaTraccia()\Sequenza
         Else
          Sequenza=SequenzaSelezionata
         EndIf
         PopItem SequenzaNellaTraccia()
         SequenzaNellaTraccia()\Sequenza=Sequenza
        Else
         PopItem SequenzaNellaTraccia()
         SequenzaNellaTraccia()\Sequenza=SequenzaSelezionata
        EndIf
        PrevItem SequenzaNellaTraccia()
       EndIf
      Until SequenzaNellaTraccia()\Sequenza<=SequenzaSelezionata
     EndIf
    EndIf
    SequenzaSelezionata=0
   Else
    EZRequest "AmySequencer message","You must select a sequence first","OK"
   EndIf
  Case TastoCursoreSu$
   If YTracceVisibili>0 Then YTracceVisibili-1
  Case TastoCursoreGiu$
   If YTracceVisibili<#MassimoTracce-TracceVisibili Then YTracceVisibili+1
  Case TastoCursoreDestra$
   If XTracceVisibili<AreaInvisibileDelMotivo
    XTracceVisibili+LarghezzaEventoBase
    XTracceVisibili=Min(XTracceVisibili,AreaInvisibileDelMotivo)
   EndIf
  Case TastoCursoreSinistra$
   If XTracceVisibili>0
    XTracceVisibili-LarghezzaEventoBase
    XTracceVisibili=Max(XTracceVisibili,0)
   EndIf
  End Select
  SecondoClicDelTopo=False

 End Select
 FlushEvents

;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True

CancellaTutto{}

If MIDIAttivato=True Then CloseSerial 0

;-------------------
;fine del programma
;program end
;------------
End
